嵌套fragment使用ViewPager2在activity异常退出后重新创建报错解决

2,573 阅读1分钟

问题

这次是一个连环踩坑,兜兜转转终于结束,在这里记录下错误的解决。 报错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

解决

ActivityFragmentManager设置有问题。

其他的都不用变动,也与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