来自一个片段并完成子活动的 startActivityForResult()在片段中不调用 onActivityResult()

FirstActivity.Java有一个调用 startActivityForResult()FragmentA.JavaSecondActivity.Java调用 finish(),但 onActivityResult从未被调用 用 FragmentA.Java写的。

FragmentA.Java代码:

  @Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// some code
Intent i = new Intent(getActivity(), SecondActivity.class);
i.putExtra("helloString", helloString);
getActivity().startActivityForResult(i, 1);
}


@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
getActivity();
if(requestCode == 1 && resultCode == Activity.RESULT_OK) {
//some code
}
}

SecondActivity.Java代码:

  @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//some code
Intent returnIntent = new Intent();
returnIntent.putExtra("result", result);


setResult(Activity.RESULT_OK,returnIntent);
finish();
}

我试过调试代码,但是从来没有调用过 onAcitvityResult()

156064 次浏览

您必须在 FirstActivity.Java中写入 onActivityResult(),如下所示

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}

所以这会调用你的片段的 onActivityResult()

编辑: 解决方案是用 startActivityForResult(i, 1);代替 getActivity().startActivityForResult(i, 1);

凯文的回答是有效的,但是使用这个解决方案很难处理数据。

最好的解决方案是不要在活动级别启动 startActivityForResult()

在你的情况下,不要打电话 getActivity().startActivityForResult(i, 1);

相反,只要使用 startActivityForResult(),它就会工作得非常好! :)

片段已经有了 startActivityForResult,如果您使用它,它将调用片段中的 onActivityResult,而不是 getActivity()..。

您必须在 FirstActivity.Java 中编写 onActivityResult () ,如下所示

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}

这将触发 FirstActivity.java 上片段的 onActivityResult 方法

我们可以直接从片段调用 startActivityForResult() 所以你应该调用 this.startActivityForResult(i, 1);而不是 getActivity().startActivityForResult(i, 1);

Intent i = new Intent(getActivity(), SecondActivity.class);
i.putExtra("helloString", helloString);
this.startActivityForResult(i, 1);

活动将把活动结果发送到您的片段。

不要在 onCreate()方法中调用 finish(),这样就可以正常工作了。

最重要的是,这里缺少的是..。 FirstActivity 的 launchMode 必须是 singleTop。如果是 singleInstance,那么在调用 startActivityForResult 方法之后,将立即调用 FragmentA 中的 onActivityResult。因此,它不会等待在 Second Activity 中调用 Finish ()方法。

因此,通过以下步骤,它一定会工作,因为它为我工作了很长的研究。

在 AndroidManifest.xml 文件中,将 FirstActivity. Java 的 launchMode 设置为 singleTop。

<activity
android:name=".FirstActivity"
android:label="@string/title_activity_main"
android:launchMode="singleTop"
android:theme="@style/AppTheme.NoActionBar" />

在 FirstActivity.java 中,覆盖 onActivityResult 方法。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}

在 FragmentA.Java 中,重写 onActivityResult 方法

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("FragmentA.java","onActivityResult called");
}

从 FragmentA.Java 调用 startActivityForResult(intent, HOMEWORK_POST_ACTIVITY);

调用 SecondActivity.java 中的 finish();方法

希望能成功。

MAinActivity 的 onActivityResult ()将调用,Frage 的 onActivityResult ()将不会调用,因为片段被放置在 Activity 中,所以很明显它将返回到 MainActivity

也许现在回答这个问题有点晚了,但是对任何人都有帮助。

在 My 的例子中,我希望从片段调用 activity,并从片段调用 setResult。

我已经使用了类片段的上下文。

startActivityForResult(new Intent(getContext(), NextActivity.class), 111);

并根据片段设置结果

getActivity().setResult(Activity.RESULT_OK);
getActivity().finish();

现在将结果分段

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK && requestCode == 111) {


}
}

试试这个:

//don't call getActivity()
getActivity().startActivityForResult(intent, REQ_CODE);


//just call
startActivityForResult(intent, REQ_CODE);
//directly from fragment