安卓中Fragment嵌套Fragment使用存在的bug

项目是fragment嵌套fragment,最初的时候在fragment  viewpager中的第一个fragment中嵌套fragment viewpager 其他是fragment 没有什么问题,后边需求改变,在第一个fragment中嵌套的fragment viewpager 要移动到第三个fragment中,意思就是第一个fragment viewpager与第三个fragment换一下位置(这需求也是简直了),然后就着手改,改着改着就出问题了,改完之后,第三个fragment viewpager页就经常出现空白或错位,异常是 java.lang.IllegalStateException: No activity

首先我们来分析一下Exception出现的原因:

通过DEBUG发现,当第一次从一个Activity启动Fragment,然后再去启动子Fragment的时候,存在指向Activity的变量,但当退出这些Fragment之后回到Activity,然后再进入Fragment的时候,这个变量变成null,这就很容易明了为什么抛出的异常是No activity

这个Exception是由什么原因造成的呢?如果想知道造成异常的原因,那就必须去看Fragment的相关代码,发现Fragment在detached之后都会被reset掉,但是它并没有对ChildFragmentManager做reset,所以会造成ChildFragmentManager的状态错误。

找到异常出现的原因后就可以很容易的去解决问题了,我们需要在Fragment被detached的时候去重置ChildFragmentManager,即

mAdapterPager = new FragmentPagerItemAdapter(getChildFragmentManager(), mPagesFragment);
@Override
public void onDetach() {

    super.onDetach();

    try {

        Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");

        childFragmentManager.setAccessible(true);

        childFragmentManager.set(this, null);

    } catch (NoSuchFieldException e) {

        throw new RuntimeException(e);

    } catch (IllegalAccessException e) {

        throw new RuntimeException(e);

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值