简体   繁体   English

无法从OnClickListener启动Activity“该类型的方法startActivity(Intent,int)未定义”

[英]Can't start Activity from OnClickListener “method startActivity(Intent, int) is undefined for the type”

I am populating a Scrollview using items retrieved from a SQLite database, and am dynamically generating an OnClickListener for each row using the code below. 我正在使用从SQLite数据库检索的项目填充Scrollview,并使用以下代码为每一行动态生成OnClickListener。 I want the code in the OnClickListener to return control to the Activity which called it (MealActivity) using an Intent, passing back the id of the item which was clicked on. 我希望OnClickListener中的代码将控制权返回给使用Intent调用它(MealActivity)的Activity,并传回被单击的项目的ID。

I've attempted this using the 2nd code segment below, but I'm getting a compile error: "The method startActivity(Intent, int) is undefined for the type OnClickListenerSelectPresetItem". 我已尝试使用下面的第二个代码段进行此操作,但遇到编译错误:“对于类型OnClickListenerSelectPresetItem,未定义方法startActivity(Intent,int)。”

How can I invoke the original Activity from my OnClickListener? 如何从OnClickListener调用原始的Activity?

public class SelectPresetItemActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_select_preset_item);

        if (savedInstanceState == null) {
            getFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment()).commit();
        }

        readRecords();
    }

    public void readRecords() {
        LinearLayout linearLayoutRecords = (LinearLayout) findViewById(R.id.linearLayoutRecords);
        linearLayoutRecords.removeAllViews();

        List<preset_item> preset_item = new TableControllerPresetItem(this).read();

        if (preset_item.size() > 0) {

            for (preset_item obj : preset_item) {

                long id = obj.id;
                String PresetDesc = obj.preset_desc;
                int PresetMinutes = obj.preset_minutes;

                String textViewContents = PresetDesc + " - "
                        + PresetMinutes + " minutes";

                TextView textViewItem = new TextView(this);
                textViewItem.setPadding(0, 10, 0, 10);
                textViewItem.setText(textViewContents);
                textViewItem.setTag(Long.toString(id));

                textViewItem.setOnClickListener(new OnClickListenerSelectPresetItem());

                linearLayoutRecords.addView(textViewItem);
            }

        }

        else {

            TextView locationItem = new TextView(this);
            locationItem.setPadding(8, 8, 8, 8);
            locationItem.setText("No records yet.");

            linearLayoutRecords.addView(locationItem);
        }
    }listener

The method startActivity(Intent, int) is undefined for the type OnClickListenerSelectPresetItem


    public class SelectPresetItemActivity extends Activity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_select_preset_item);

            if (savedInstanceState == null) {
                getFragmentManager().beginTransaction()
                        .add(R.id.container, new PlaceholderFragment()).commit();
            }

            readRecords();
        }

        public void readRecords() {
            LinearLayout linearLayoutRecords = (LinearLayout) findViewById(R.id.linearLayoutRecords);
            linearLayoutRecords.removeAllViews();

            List<preset_item> preset_item = new TableControllerPresetItem(this).read();

            if (preset_item.size() > 0) {

                for (preset_item obj : preset_item) {

                    long id = obj.id;
                    String PresetDesc = obj.preset_desc;
                    int PresetMinutes = obj.preset_minutes;

                    String textViewContents = PresetDesc + " - "
                            + PresetMinutes + " minutes";

                    TextView textViewItem = new TextView(this);
                    textViewItem.setPadding(0, 10, 0, 10);
                    textViewItem.setText(textViewContents);
                    textViewItem.setTag(Long.toString(id));

                    textViewItem.setOnClickListener(new OnClickListenerSelectPresetItem());

                    linearLayoutRecords.addView(textViewItem);
                }

            }

            else {

                TextView locationItem = new TextView(this);
                locationItem.setPadding(8, 8, 8, 8);
                locationItem.setText("No records yet.");

                linearLayoutRecords.addView(locationItem);
            }
        }

This is the OnCLickListener code: 这是OnCLickListener代码:

public class OnClickListenerSelectPresetItem implements OnClickListener {
    public final static String EXTRA_MEAL_ID = "com.ian.mealtimer.MEAL_ID";

    @Override
    public void onClick(View view) {

        Long selectedMealId = Long.valueOf(view.getTag().toString());
        Intent myIntent = new Intent(view.getContext(),
                MealActivity.class);
        long mealId = -1;
        myIntent.putExtra(EXTRA_MEAL_ID, selectedMealId);
        startActivity(myIntent, 0);

    }
}

You should use: startActivity (Intent intent) 您应该使用: startActivity(意图意图)

there is a different method which has an integer parameter: startActivityForResult (Intent intent, int requestCode) 有一个具有整数参数的方法: startActivityForResult(Intent intent,int requestCode)

Also a context can start an activity, so you have to get the context. 上下文也可以启动活动,因此您必须获取上下文。 Easily you can get it from your view: 您可以轻松地从视图中获取它:

@Override
public void onClick(View view) {

    Long selectedMealId = Long.valueOf(view.getTag().toString());
    Intent myIntent = new Intent(view.getContext(),
            MealActivity.class);
    long mealId = -1;
    myIntent.putExtra(EXTRA_MEAL_ID, selectedMealId);
    view.getContext().startActivity(myIntent);
}

You can read more about starting activities here. 您可以在此处阅读有关开始活动的更多信息。

startActivity is a method of the class Context. startActivity是Context类的方法。 The OnClickListener cannot know on which context it should be called. OnClickListener无法知道应在哪个上下文上调用它。 Pass the Context as Parameter to the constructor of the OnClickListener and save it inside: In class OnClickListenerSelectPresetItem: 将Context作为参数传递给OnClickListener的构造函数并将其保存在内部:在类OnClickListenerSelectPresetItem中:

private Context context;
public OnClickListenerSelectPresetItem(Context context){
   this.context=context;
}

Then call startActivity on this context 然后在此上下文上调用startActivity

this.context.startActivity(myIntent, 0);

And construct them by passing the activity 并通过活动来构建它们

textViewItem.setOnClickListener(new OnClickListenerSelectPresetItem(this));

How about you pass the activity to the constructor of the OnClickListenerSelectPresetItem and then use it like the following : 您如何将活动传递给OnClickListenerSelectPresetItem的构造函数,然后像下面这样使用它:

public class OnClickListenerSelectPresetItem implements OnClickListener {
    public final static String EXTRA_MEAL_ID = "com.ian.mealtimer.MEAL_ID";
private SelectPresetItemActivity selectPresetItemActivity;
    public OnClickListenerSelectPresetItem(SelectPresetItemActivity selectPresetItemActivity){
this.selectPresetItemActivity = selectPresetItemActivity;
     }
    @Override
    public void onClick(View view) {

        Long selectedMealId = Long.valueOf(view.getTag().toString());
        Intent myIntent = new Intent(view.getContext(),
                MealActivity.class);
        long mealId = -1;
        myIntent.putExtra(EXTRA_MEAL_ID, selectedMealId);
        selectPresetItemActivity.startActivity(myIntent, 0);

    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM