gpt4 book ai didi

java - Fragment 的 setActivityForResult 返回空数据

转载 作者:行者123 更新时间:2023-12-02 04:51:15 24 4
gpt4 key购买 nike

我有一个 fragment MainFragment 并且我这样做:

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

Activity 启动正常,它启动自己的 PersonFragment 并在 PersonFragment 内,我这样做:

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

我看到代码转到了 onActivityResultdata 为空。我在这里搞砸了什么?

更新:
我发现按后退按钮不会调用 onDestroy()
但是我看到的所有示例都使用了 getActivity.finish() 并且我不想完成该 Activity 。仅当用户按下例如回传数据

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

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

最佳答案

来自 Activity documentation关于完成:

Call this when your activity is done and should be closed. The ActivityResult is propagated back to whoever launched you via onActivityResult().

来自documentation关于onActivityResult:

Called when an activity you launched exits, giving you the requestCode you started it with, the resultCode it returned, and any additional data from it.

因此,仅当第二个 Activity 完成时才会调用 onActivityResult

如果您不想完成您的PersonActivity以将结果发送到您的主 Activity ,那么您可能需要启动另一个 Intent 来发送数据或传递使用静态字段的数据(根本不是最佳实践)。

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

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

根据评论进行跟进:

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 结果不起作用的原因。

关于java - Fragment 的 setActivityForResult 返回空数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29214931/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com