startActivityForResult()从一个Fragment和完成子Activity,不会调用onActivityResult()在Fragment
FirstActivity.Java
有一个调用startActivityForResult()
的FragmentA.Java
。 SecondActivity.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()
。