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


问题

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

声明:HEUE NOTE|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA 4.0协议进行授权

转载:转载请注明原文链接 - 嵌套fragment使用ViewPager2在activity异常退出后重新创建报错解决