问题:当一个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






网友评论