startActivityForResult()从一个Fragment和完成子Activity,不会调用onActivityResult()在Fragment

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

我已经尝试debugging代码,但onAcitvityResult()永远不会被调用。

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

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

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

编辑:解决方法是replacegetActivity().startActivityForResult(i, 1);startActivityForResult(i, 1);

凯文的答案有效,但这使得使用该解决scheme的数据难以发挥。

最佳解决scheme是不要在活动级别启动startActivityForResult()

在你的情况下不要调用getActivity().startActivityForResult(i, 1);

相反,只需使用startActivityForResult() ,它将工作得很好! 🙂

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

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

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

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

最重要的是,这里所缺less的是…… FirstActivity的launchMode必须是singleTop。 如果是singleInstance,则在调用startActivityForResult方法之后,将调用FragmentA中的onActivityResult。 所以,它不会等待在SecondActivity中调用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方法。 因为这将调用片段A的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"); } 

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

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

希望这会工作。

我们可以直接从Fragment调用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() ,那么它就可以正常工作。

在ParentActivity中调用你的onActivityresult()