You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 05:45:34