本文解决问题:
java.lang.IllegalStateException: FragmentManager is already executing transactions
问题背景描述:
在Fragment中 用tablayout+viewpager+fragment,即Fragment嵌套Fragment场景、或者ViewPager2嵌套ViewPager2时。
执行生命周期返回、或使用了JetPack Navigation NavController.navigateUp(),FragmentManager 栈进行出栈管理错误,就会报上述问题。
问题可能原因:
在fragment里面viewpager的setadapter的时候使用的是getActivity().getSupportFragmentManager,这时候会和父activity相冲突,应该为:getChildFragmentManager。比如:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//错误用法,使用的是getActivity().getSupportFragmentManager,会和父activity相冲突
mBinding.tabLayout.attachToViewPager(
mBinding.viewPager, titleList, fragmentList, parentFragmentManager, lifecycle)
//正确用法
mBinding.tabLayout.attachToViewPager(
mBinding.viewPager, titleList, fragmentList, childFragmentManager, lifecycle)
}
在Activity初始化FragmentTabHost的时候,传入了一个fragmentmanager,就是getFragmentManager拿到的,因为tabhost要交互的是第一层的fragment ,是直接和activity相交互的。
而在HomeFragment里嵌套的ViewPager ,因为要交互的是嵌套的Fragment,所以需要拿到ChildFragmentManager才行。
解决方法:
HomeFragment由Activity的FragmentManager 控制,在一级嵌套中要使用getParentFragmentManager()控制。
在第二层HomeFragment中要用getChildFragmentManager() 控制ViewPager中的Fragment。