页面为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