有段时间不写博客了,但是今天这个问题浪费了我两天的时间,所以有必要做个笔记。项目中有个需求就是多个tab控制多个界面,所以就是Fragment–TabLayout+ViewPager–内嵌多个Fragment,看着没啥问题,但是子Fragment中有个选择图片的操作,结果问题来了,OnActivityResult()不回掉,当时我就想到嵌套返回的问题,所以在最外层的Fragment的OnActivityResult()做了对应处理,但是只有Tab的index=0的fragment可以返回图片信息,其他index大于零的都是一闪而过,而且不报红,这个就有点坑了,最后在Logcat里发现这么一条警告“FragmentActivity: Activity result fragment index out of range”,看着好像是说下标越界了,所以我立马去FragmentActivity中搜这个log,结果就看到了下面的代码:
看到index = requestCode>>16,index是通过请求码做位运算算出的,并不是我们每个子fragment实际对应的下标值,所以就出现越界的情况,而且这里也没有抛异常,明显是没考虑多层嵌套的问题;
解决方案
1、在子fragment直接getParentFragment().startActivityForResult(intent, requestCode);去开启新界面
getParentFragment().startActivityForResult(intent, requestCode)
2、在最外层的fangment的onActivityResult(int requestCode, int resultCode, Intent data)去获取对用子fragment的应用去执行对应的逻辑处理方法;例如
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
onActivityResult(requestCode, resultCode, data);
ChildFragment cf=mFragments.get(index);
//方法一 调用子Fragment的onActivityResult,然后子Fragment去处理自己的onActivityResult逻辑
cf.onActivityResult(requestCode, resultCode, data);
//方法2 直接在子fragment中提供对应的业务处理的public方法,一步到位
cf.doSomething(data);
}
总结
两层嵌套的返回处理掌握i了,n层嵌套也是一样的原理,如果有啥新思路可以留言评论,相互学习