Android中Fragment嵌套报错:FragmentManager事务冲突的解决方法
修复Fragment嵌套时的"FragmentManager is already executing transactions"错误
核心解决方案
- 使用
childFragmentManager替代parentFragmentManager来管理嵌套的子Fragment(推荐方案) - 若必须使用
parentFragmentManager,延迟事务执行到当前生命周期事务完成后
原因分析
你的父Fragment处于ViewPager2中,ViewPager2的FragmentStateAdapter会在Fragment的start生命周期阶段自动执行与max-lifecycle相关的事务。此时在onViewCreated中调用parentFragmentManager.commit(),会与正在执行的系统事务冲突,触发IllegalStateException。
而childFragmentManager是Android官方为Fragment嵌套场景提供的专属管理器,它独立于父级Fragment的事务流程,不会产生冲突。
修改后的代码(推荐方案)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) childFragmentManager.beginTransaction().add( R.id.calendarContainer, calendar, PersianCaldroidFragment::class.java.name ).commit() }
备选方案(仅特殊场景使用)
如果因业务需求必须使用parentFragmentManager,可以通过view.post()延迟事务执行,确保当前系统事务完成后再执行自定义事务:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) view.post { parentFragmentManager.beginTransaction().add( R.id.calendarContainer, calendar, PersianCaldroidFragment::class.java.name ).commit() } }
内容的提问来源于stack exchange,提问作者Dr.KeyOk
相关产品推荐
相关产品推荐

