问题:当一个Activity
中包含一个Fragment
时我们使用startActivityForResult()
方法启动一个Activity
,待这个被启动的Activity
设置了一个返回值然后被销毁,如何在Activity和Fragment中获得这个返回值呢?
分析:启动Activity
时,我们一般会设置一个requestCode
以便在开启了多个具有返回值的Activity
时进行识别以做出不同的响应对策。但使用不同的启动方式,在Activity
和Fragment
中拦截到的结果不同,主要有以下几种情况:
- 在
Activity
中启动并获得结果: 可以在Activity
的onActivityResult()
方法中根据requestCode
就可以获得返回值,无论是否调用super.onActivityResult()
方法,其中的Fragment
不会获得任何值 - 在
Fragment
中启动并在Activity
中获得结果:在Fragment
中使用getActivity().startActivityForResult()
方法启动,可以在Activity
的onActivityResult()
方法中根据requestCode
就可以获得返回值,无论是否在Activity
的onActivityResult()
调用super.onActivityResult()
方法,其中的Fragment
不会获得任何值 - 在
Fragment
中启动并在Fragment
中获得结果:在Fragment
中使用startActivityForResult()
方法启动,可以在Fragment
的onActivityResult()
方法中根据requestCode
就可以获得返回值,必须调用super.onActivityResult()
方法
注意:对于3来说,如果在Activity
的onActivityResult()
方法中没有调用super.onActivityResult()
方法,那么在Fragment
中不能获取任何数据,在Activity中
可以获得数据但是无法根据requestCode
去识别,传入的是一个6位的requestCode
总结
-
Fragment
中启动,Activity
中接收结果:使用getActivity().startActivityForResult()
-
Fragment
中启动,Fragment
中接收结果:使用startActivityForResult()
,且在Activity
的onActivityResult()
中调用super.onActivityResult()
参考
- wrong requestCode in onActivityResult
- Wrong requestCode returned onActivityResult from another Activity
相关资料
-
Issue 40537:Nested fragment not receiving response in onActivityResult()中提到使用support library时,
Activity
中存在Fragment
与Fragment
嵌套使用,最里层的Fragment
的onActivityResult()
接收不到返回结果,已在android-support-library 23.2.0解决了
Demo