【问题标题】:onActivityResult Intent is null when passing Intent from Adapter从适配器传递 Intent 时,onActivityResult Intent 为 null
【发布时间】:2017-06-10 16:30:04
【问题描述】:

我在返回带有结果的 Activity 时遇到了一个奇怪的问题,我正在从这样的适配器传递 startActivityForResult 的 Intent:

Intent i = new Intent(activity, EditInfoActivity.class);
i.putExtra("id", list.get(position).getID());
activity.startActivityForResult(i, 100);

在第二个活动中,即在我的情况下,在 EditInfoActivity 中单击Button,我正在为第一个活动设置结果,如下所示:

Intent i = getIntent();
i.putExtra("isDataChange", isDataChange);
setResult(100, i);
finish();

在 Activity 的 onActivityResult 方法中,我能够得到结果代码,但得到 Intent null

为什么?有人对此有任何想法,请分享。

在活动中:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == 100) {
    //Here data is null and app crash
    if (data.getExtras() != null && data.getBooleanExtra("isDataChange", false)) {
       recreate();
    }
  }
}

【问题讨论】:

    标签: android android-intent onactivityresult


    【解决方案1】:

    首先,您需要使用 REQUEST_CODE 启动 Activity:

    // Here we set a constant for the code.
    private final int REQUEST_CODE = 100;
    
    Intent i = new Intent(activity, EditInfoActivity.class);
    i.putExtra("id", list.get(position).getID());
    activity.startActivityForResult(i, REQUEST_CODE);
    

    那么你需要在完成EditInfoActivity时发送RESULT_OK

    Intent i = getIntent();
    i.putExtra("isDataChange", isDataChange);
    setResult(RESULT_OK, i);
    finish();
    

    然后用这个处理你的第一个活动的结果:

    Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      // REQUEST_CODE is defined as 100
      if (resultCode == RESULT_OK && requestCode == 100) {
         // do process
      }
    }
    

    【讨论】:

      【解决方案2】:

      setResult TAKES RESULT_CODE 而不是 REQUEST_CODE。

      用这个替换你的代码,也许它会解决你的问题。

      setResult(RESULT_OK, i);
      

      在你onActivityResult

      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
          if (resultCode == RESULT_OK) {
         //Here data is null and app crash
              if (data != null && data.getBooleanExtra("isDataChange", false)) {
                  recreate();
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

        两个错误。您正在传递用于启动您正在完成的活动的意图。请改用new Intent()

        在设置活动结果时,您应该使用结果代码,而不是请求代码 setResult(RESULT_OK) 或者 RESULT_CANCELED,并相应地处理响应。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-22
          • 2013-01-11
          • 1970-01-01
          • 2014-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多