onActivityResult从Adapter传递Intent时,Intent为null

时间:2017-01-25 13:11:11

标签: android android-intent onactivityresult

我在返回带有结果的Activity时面临一个奇怪的问题,我正在从这样的适配器传递Intent i = new Intent(activity, EditInfoActivity.class); i.putExtra("id", list.get(position).getID()); activity.startActivityForResult(i, 100); 的Intent:

Button

并且在第二个Activity中,即在Intent i = getIntent(); i.putExtra("isDataChange", isDataChange); setResult(100, i); finish(); 点击的情况下,在我的情况下在EditInfoActivity中,我正在设置第一个活动的结果,如下所示:

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(); } } }

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

在活动中:

{{1}}

3 个答案:

答案 0 :(得分:5)

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

// 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
  }
}

答案 1 :(得分:3)

setResult取代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();
        }
    }
}

答案 2 :(得分:2)

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

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