记一次 java.lang.IllegalArgumentException: No view found for id 0x7f0800ac 崩溃和对应解决方案
问题出现
- 嵌套层级 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()
}
}
解决方案:
- 使用 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()
}
}
- 使用 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 导致的问题