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为何被销毁,我目前还未探究。
如有纰漏和其他解决方案,请赐教!