页面为fragment+viewpager+fragment结构,直接打开,默认选中首个fragment正常,指定跳转到第3个再切回第1个fragment,报错如下:

java.lang.IllegalStateException: FragmentManager is already executing transactions
	at androidx.fragment.app.FragmentManager.ensureExecReady(SourceFile:1931)
	at androidx.fragment.app.FragmentManager.execSingleAction(SourceFile:1967)
	at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(SourceFile:311)
	at androidx.fragment.app.FragmentPagerAdapter.finishUpdate(SourceFile:249)
	at androidx.viewpager.widget.ViewPager.populate(SourceFile:1244)
	at androidx.viewpager.widget.ViewPager.populate(SourceFile:1092)
	at androidx.viewpager.widget.ViewPager.setOffscreenPageLimit(SourceFile:856)
	at com.xxx.xxx.fragment.HomeFragment.initVp(SourceFile:108)
	at androidx.fragment.app.Fragment.performViewCreated(SourceFile:2987)
	at androidx.fragment.app.FragmentStateManager.createView(SourceFile:546)
	at androidx.fragment.app.FragmentStateManager.moveToExpectedState(SourceFile:282)
	at androidx.fragment.app.FragmentManager.executeOpsTogether(SourceFile:2189)
	at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(SourceFile:2100)
	at androidx.fragment.app.FragmentManager.execPendingActions(SourceFile:2002)
	at androidx.fragment.app.FragmentManager$5.run(SourceFile:524)
	at android.os.Handler.handleCallback(Handler.java:938)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loopOnce(Looper.java:210)
	at android.os.Looper.loop(Looper.java:299)
	at android.app.ActivityThread.main(ActivityThread.java:8306)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:576)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1073)

通常在嵌套的fragment中出现,解决:
根据fragment的容器,将fragmentManager设为childFragmentManager或parentFragmentManager

val fragmentAdapter = FragmentAdapter(childFragmentManager, listFragment, tab)
binding.viewPager.adapter = fragmentAdapter

更多推荐