I am using a bottom navigation bar in my MainActivity to handle some fragments. This is the code used for switching between them:
private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
if (item.isChecked &&
supportFragmentManager.findFragmentById(R.id.act_main_fragment_container) != null
)
return@OnNavigationItemSelectedListener false
val fragment =
when (item.itemId) {
R.id.navigation_home -> fragments[0]
R.id.navigation_bookings -> fragments[1]
R.id.navigation_messages -> fragments[2]
R.id.navigation_dashboard -> fragments[3]
R.id.navigation_profile -> fragments[4]
else -> fragments[0]
}
this replaceWithNoBackStack fragment
return@OnNavigationItemSelectedListener true
}
the method replaceWithNoBackstack is just a short-hand for this:
supportFragmentManager
?.beginTransaction()
?.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
?.replace(containerId, fragment)
?.commit()
问题是,当我在它们之间切换得更快时,我的应用程序会崩溃,但有以下例外:
java.lang.IllegalStateException:只能在所有者初始化阶段创建restarter 在androidx.savedstate.SavedStateRegistryController.performRestore(SavedStateRegistryController.java:59) 在androidx.fragment.app.Fragment.performCreate(Fragment.java:2580) 在androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:837) 在androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1237) 在androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1302) 在androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439) 在androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2075) 在androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1865) 在androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1820) 在androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1726) 在androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150) 在android.os.Handler.handleCallback(Handler.java:789) 在android.os.Handler.dispatchMessage(Handler.java:98) 在android.os.Looper.loop(Looper.java:164) 在android.app.ActivityThread.main(ActivityThread.java:6709) at java.lang.refect.Method.Invoke(本机方法) 在com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769) 我找了很久,也找不到答案.
I also got this error if I do an API call, put the app in background, wait for the response, and at the time I go back to the app, the app crashes because I am trying to display a dialog fragment immediately (the reason I think this is happening is that the transaction of recreating the fragment when coming back from the background is still in progress at the time of displaying the dialog fragment). I solved this in a hacky way by setting a 500ms delay for the dialog because I couldn't figure out other solutions.
请询问您是否需要有关此的更多详细信息.
POSSIBLE TEMP SOLUTIONS
EDIT
EDIT 2 I solved the issue by removing setTransition() from fragment transactions. At least I know the reason why android apps does not have good transitions in general
EDIT 3