Android Bug : Fragment no longer exists for key f0: index 0

Fragment no longer exists for key f0: index 0

报错信息:

Fragment no longer exists for key f0: index 0

开发情况

在Activity里面把两个Fragment加载到FrameLayout里面,切换显示
每个Fragment里面有Viewpager包装两个Fragment

即:Fragment嵌套ViewPager嵌套Fragment
切换回第一个外层Fragment的时候报上述错误

// 初始化Fragment
        mCurFragment = fragmentA = new FragmentA();
        getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.lay_container, mCurFragment)
                .commit();

 // 切换显示     
 getSupportFragmentManager().beginTransaction()
                .replace(R.id.lay_container, fragmentB)
                .commit();

网上解决方案

ViewPager的FragmentAdapter里面,不要使用FragmentStatePagerAdapter,而是让里外层Fragment的Adaper继承> FragmentPagerAdapter。

  • 在报错的Fragment的Adapter中重写以下方法,返回空
@Override  
public Parcelable saveState() { 
         return null;  
 }

结果
不报异常,app没有奔溃,但是ViewPager里面的Fragment没有显示,空白,该方案不适合此处问题。

解决方案

//初始化显示的Fragment(外层的)
getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.lay_container, fragmentA)
                .add(R.id.lay_container,fragmentB)
                .show(fragmentA)
                .hide(fragmentB)
                .commit();
//切换Fragment(外层的)
public void triggerFragment() {
        BaseFragment fragment;
        if (mCurFragment == fragmentA) {
            fragment = fragmentB;
            getSupportFragmentManager().beginTransaction()
                    .show(fragment)
                    .hide(fragmentA)
                    .commit();
        } else {
            fragment = fragmentA;
            getSupportFragmentManager().beginTransaction()
                    .show(fragment)
                    .hide(fragmentB)
                    .commit();
        }

        // 重新赋值当前正在显示的Fragment
        mCurFragment = fragment;

    }

总结

我此次出现该异常的情况是,我在一个FrameLayout容器里面要切换加载两个Fragment,而这两个Fragment里面又各自含有ViewPager+Fragment。当切换回第一个外层的Fragment时,报错Fragment no longer exists for key f0: index 0,原因是直接replace了Fragment,导致了Fragment被销毁了,变为空,状态就出了问题,于是网上就有重写saveState()此方法的解决方案,但不治本,虽不报错,但内层的ViewPager里面的Fragment不显示了。

于是我尝试不使用getSupportFragmentManager().beginTransaction() .replace方法,改为show()hide()方法,这样Fragment就不会被销毁了。

至于为何Fragment为何被销毁,我目前还未探究。

如有纰漏和其他解决方案,请赐教!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忘词木头人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值