问题
这次是一个连环踩坑,兜兜转转终于结束,在这里记录下错误的解决。
报错1:java.lang.IllegalStateException: Fragment no longer exists for key f#0: unique id efc21594-63b5-40ec-8cab-8166a98d6a93
报错2:can't change tag of XXFragment...:was f0 now 0
报错3:fragment is added
报错4:Expected the adapter to be 'fresh' while restoring state
解决
是Activity
的FragmentManager
设置有问题。
其他的都不用变动,也与FragmentStateAdapter
无关,不用设置pager.isSaveEnabled = false
等等。
只!需!要!在ContainerActivity
里改变,代码如下:
- 原代码:
private fun viewInit() {
if (fragment != null) {
supportFragmentManager.beginTransaction()
.add(R.id.contain_frame_main, fragment!!, tag)
.commitAllowingStateLoss()
...
}
}
- 新代码:
/**
其中fragment为一个实例,可空只是这里的需要,和问题解决无关
*/
private fun viewInit() {
//判断FragmentManager内是否存在同id的fragment,存在就用存在的
//这个解决了:Fragment no longer exists for key f#0
fragment?.let {
supportFragmentManager.findFragmentById(it.id)?.run {
fragment = this
}
}
if (fragment != null) {
//判断该fragment的tag是否已经存在,存在就用存在的
//这里解决:ViewPager: Can't change tag of fragment XXFragment:was f0 now 0
val mTag: String? = fragment!!.tag ?: tag
//判断fragment is added来解决它
if (!fragment!!.isAdded)
supportFragmentManager.beginTransaction()
.add(R.id.contain_frame_main, fragment!!, mTag)
.commitAllowingStateLoss()
else supportFragmentManager.beginTransaction().show(fragment!!)
...
}
}
参考资料
java.lang.IllegalStateException: Can't change tag of fragment xxxFragment
Comments | NOTHING