在使用support v4中的Fragment时,如果我们需要调用startActivityForResult方法来与跳转的Activity进行通信时,如果希望Fragment的onActivityResult方法能够被响应,我们就必须调用Fragment的startActivityForResult方法,而不是调用:
1 | getActivity().startActivityForResult() |
后者调用的是Fragment的宿主Activity,即FragmentActivity的startActivityForResult方法。
两者的区别如下:
Fragment中的startActivityForResult方法如下:
1 | public void startActivityForResult(Intent intent, int requestCode) { |
调用了FragmentActivity中的startActivityFromFragment方法:
1 | public void startActivityFromFragment(Fragment fragment, Intent intent, |
可以看到,该方法把Fragment的index值存在了requestCode的高16位,然后调用了startActivityForResult方法。
接下来我们来看看消息的返回处理,FragmentActivity中的onActivityResult方法:
1 | /** |
这里把requestCode的高16位(即Fragment的index值)取了出来,并通过index找到对应的Fragment,然后调用Fragment的onActivityResult来分发消息。
因此,如果直接调用Fragment的宿主FragmentActivity的startActivityForResult方法,requestCode中就不会存入Fragment的index值,在onActivityResult处理消息时也会找不到相应的Fragment进行进一步的消息分发。