【问题标题】:Can't start Activity from OnClickListener "method startActivity(Intent, int) is undefined for the type"无法从 OnClickListener 启动 Activity “方法 startActivity(Intent, int) 未定义类型”
【发布时间】:2014-05-27 04:11:42
【问题描述】:

我正在使用从 SQLite 数据库检索的项目填充 Scrollview,并使用下面的代码为每一行动态生成 OnClickListener。我希望 OnClickListener 中的代码将控制权返回给使用 Intent 调用它的 Activity(MealActivity),并传回被点击的项目的 id。

我已尝试使用下面的第二个代码段进行此操作,但出现编译错误:“方法 startActivity(Intent, int) 未定义 OnClickListenerSelectPresetItem 类型”。

如何从我的 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);
            }
        }

这是 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);

    }
}

【问题讨论】:

  • 你为什么不试试 ((Activty)view.getContext()).startActivity(myIntent);

标签: java android android-intent onclicklistener


【解决方案1】:

您应该使用: startActivity (Intent intent)

有一个不同的方法,它有一个整数参数: startActivityForResult (Intent intent, int requestCode)

上下文也可以启动一个活动,所以你必须获取上下文。您可以轻松地从您的视图中获取它:

@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.

【讨论】:

    【解决方案2】:

    startActivity 是 Context 类的一个方法。 OnClickListener 不知道应该在哪个上下文中调用它。将上下文作为参数传递给 OnClickListener 的构造函数并将其保存在里面: 在 OnClickListenerSelectPresetItem 类中:

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

    然后在这个上下文中调用 startActivity

    this.context.startActivity(myIntent, 0);
    

    并通过传递活动来构造它们

    textViewItem.setOnClickListener(new OnClickListenerSelectPresetItem(this));
    

    【讨论】:

      【解决方案3】:

      如何将活动传递给 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);
      
          }
      }
      

      【讨论】:

      • 感谢克里斯波和阿尔卡多米先生。我刚刚尝试了您的两种解决方案,但 startActivity 调用在两种情况下都会产生相同的编译时错误:“Activity 类型中的方法 startActivity(Intent, Bundle) 不适用于参数 (Intent, int)”。
      • 我猜 startActivity 的第二个参数不正确(我的错误)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多