Fragment 嵌套 错误使用FragmentManager 导致崩溃

279 阅读1分钟

记一次 java.lang.IllegalArgumentException: No view found for id 0x7f0800ac 崩溃和对应解决方案

问题出现
  1. 嵌套层级 Activity → ParentFragment → ViewPager2 → PageFragment → ChildFragment; 在 pageFragment 中使用 parentFragmentManager add 添加 ChildFragment 时,第一次创建时能正常显示,然后重构(旋转重构)后会直接崩溃;
private fun initView() {
    //崩溃的逻辑
    if(fragmentThree == null){
       fragmentThree = FragmentThree()
       parentFragmentManager.beginTransaction().add(R.id.fl_content_1,fragmentThree!!,TAG_FRAGMENT_THREE).commit()
    }
}
解决方案:
  1. 使用 findFragmentByTag 去获取布局里的ChildFragment,这种情况虽然不会崩溃,这个逻辑就是获取到fragment后不都添加步骤 所以没有出现崩溃,但是因为没有使用正确的fragmentManager 会导致 ChildFragment 不显示
private fun initView() {
    
    parentFragmentManager.findFragmentByTag(TAG_FRAGMENT_THREE)?.let {
       fragmentThree = it as FragmentThree
    }
    if(fragmentThree == null){
       fragmentThree = FragmentThree()
       parentFragmentManager.beginTransaction().add(R.id.fl_content_1,fragmentThree!!,TAG_FRAGMENT_THREE).commit()
    }
}
  1. 使用 findFragmentByTag 去获取布局里的ChildFragment,并且使用 childFragmentManager 不要使用parentFragmentManager,这样就正常了
private fun initView() {
    //修复逻辑 使用正确的 FragmentManager
    childFragmentManager.findFragmentByTag(TAG_FRAGMENT_THREE)?.let {
       fragmentThree = it as FragmentThree
    }
    if(fragmentThree == null){
       fragmentThree = FragmentThree()
       childFragmentManager.beginTransaction().add(R.id.fl_content_1,fragmentThree!!,TAG_FRAGMENT_THREE).commit()
    }
}
总结:

这个问题主要还是因为没有正确的使用 FragmentManager 导致的问题

示例:github.com/tao11122233…