【问题标题】:setActivityForResult from Fragment returns null data来自 Fragment 的 setActivityForResult 返回空数据
【发布时间】:2015-03-24 04:16:34
【问题描述】:

我有一个片段MainFragment,我有:

Intent i = new Intent(getActivity(), PersonActivity.class);
startActivityForResult(i, 0);

活动开始正常,它开始自己的PersonFragmentPersonFragment 我做:

@Override
 public void onDestroy() {
      super.onDestroy();
      Intent i = new Intent();
      i.putExtra(PERSON_ID_EXTRA, getPersonId());
      i.putParcelableArrayListExtra(PERSON_CONTACT_LIST, (ArrayList<? extends Parcelable>) contactFriends);
      getActivity().setResult(Activity.RESULT_OK, i);
}

回到我的MainFragment 我愿意:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if ( requestCode != 0) {
            return;
        }
        int personId = data.getIntExtra(PERSON_ID_EXTRA, -1);
        List<Person> contacts = data.getParcelableArrayListExtra(PERSON_CONTACT_LIST);
        for(Person p:contacts) {
            Log.d("APP", p.getFullName());
        }
}

我看到代码转到onActivityResult,但data 为空。我在这里搞砸了什么?

更新:
我看到按下后退按钮不会调用onDestroy()
但是我看到的所有示例都在哪里使用getActivity.finish(),我不想完成活动。只有当用户按下例如回传数据

更新 2:
我添加了以下内容并浏览了该代码,但结果 onActivityResult 中的 Intent data 仍然为空

@Override
 public void onPause() {
      super.onPause();
      Intent i = new Intent();
      i.putExtra(PERSON_ID_EXTRA, getPersonId());
      i.putParcelableArrayListExtra(PERSON_CONTACT_LIST, (ArrayList<? extends Parcelable>) contactFriends);
      getActivity().setResult(Activity.RESULT_OK, i);
}

【问题讨论】:

  • 覆盖onKeyDown而不是使用onDestroy()
  • @Apurva:我会尝试,但也请检查 OP 中的更新
  • @Apurva:onKeyDown 是活动方法。我在片段中设置结果。我应该如何使用它?
  • 我也知道,但我看到了这个stackoverflow.com/questions/22552653/…
  • 如果您想在片段中使用 startActivityForResult,请不要忘记在 FragmentActivity 类的 startActivityForResult 中添加 return false。这个在片段一之前。希望对您有所帮助

标签: java android android-fragments android-activity


【解决方案1】:

来自Activitydocumentationfinish

当您的活动完成并应该关闭时调用它。这 ActivityResult 被传播回通过 onActivityResult()。

来自documentation关于onActivityResult

当您启动的活动退出时调用,为您提供 requestCode 您开始使用它、它返回的 resultCode 以及任何其他 数据。

所以,onActivityResult 只会在第二个活动完成时被调用。

如果您不想 finishPersonActivity 将结果发送到您的主要活动,那么您可能需要启动另一个意图来发送数据或使用静态字段传递数据(不是最佳实践完全)。

在您的情况下,要设置按后退按钮时的结果,您可以编写如下代码:

public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch (keyCode) {
        case KeyEvent.KEYCODE_BACK:
            Intent i = new Intent();
            i.putExtra(PERSON_ID_EXTRA, getPersonId());
            i.putParcelableArrayListExtra(PERSON_CONTACT_LIST, (ArrayList<? extends Parcelable>) contactFriends);
            getActivity().setResult(Activity.RESULT_OK, i);
            finish();
            return true;
    }
    return false;
}

根据 cmets 跟进:

Activity 类上的finish() 的代码如下所示:

// Call this when your activity is done
// and should be closed. The ActivityResult
// is propagated back to whoever launched
// you via onActivityResult().
public void finish() {
    if (mParent == null) {
        int resultCode;
        Intent resultData;
        synchronized (this) {
            resultCode = mResultCode;
            resultData = mResultData;
        }
        if (false) Log.v(TAG, "Finishing self: token=" + mToken);
        try {
            if (resultData != null) {
                resultData.prepareToLeaveProcess();
            }
            if (ActivityManagerNative.getDefault()
                .finishActivity(mToken, resultCode, resultData)) {
                mFinished = true;
            }
        } catch (RemoteException e) {
            // Empty
        }
    } else {
        mParent.finishFromChild(this);
    }
}

在这里你可以看到设置结果值的责任在于finish()方法。

然后,在Activity被销毁之前,调用onDestroy()方法。这就是为什么在onDestroy() 方法上设置Activity 的结果不起作用的原因。

【讨论】:

  • start another intent to send the data:这是什么意思?
  • So, onActivityResult will only be called when the second activity finishes. 但我看到它也是在onPause 之后调用的
  • @Jim 我的意思是你可以创建一个new Intent,然后用额外的东西启动它来发送数据
  • @Jim 我做了一个测试,在我的情况下,onActivityResultonPause 之后没有被调用。我将进行另一个快速测试以仔细检查
  • 但是我不是已经创建了一个新的 Intent 吗?对不起,我不确定你的意思
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-27
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 2016-09-17
相关资源
最近更新 更多