Я использую нижнюю панель навигации в MainActivity для обработки некоторых фрагментов. Это код, используемый для переключения между ними:
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
}
метод replaceWithNoBackstack - это всего лишь сокращение для этого:
supportFragmentManager
?.beginTransaction()
?.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
?.replace(containerId, fragment)
?.commit()
Проблема в том, что когда я быстрее переключаюсь между ними, мое приложение вылетает со следующим исключением:
java.lang.IllegalStateException: перезапуск должен быть создан только на этапе инициализации владельца в androidx.savedstate.SavedStateRegistryController.performRestore (SavedStateRegistryController.java:59) в androidx.fragment.app.Fragment.performCreate (Fragment.java:25. fragment.app.FragmentManagerImpl.moveToState (FragmentManagerImpl.java:837) на androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState (FragmentManagerImpl.java:1237) на androidx.fragment.app.Fragment.ManagerManager1. .fragment.app.BackStackRecord.executeOps (BackStackRecord.java:439) в androidx.fragment.app.FragmentManagerImpl.executeOps (FragmentManagerImpl.java:2075) в androidx.fragment.app.FragmentManagerImplager.executeOpsMava:Together18 androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute (FragmentManagerIm pl.java:1820) на androidx.fragment.app.FragmentManagerImpl.execPendingActions (FragmentManagerImpl.java:1726) на androidx.fragment.app.FragmentManagerImpl $ 2.run (FragmentManagerImpl.java:150) на android.os.Handler.handle Handler.java:789) на android.os.Handler.dispatchMessage (Handler.java:98) на android.os.Looper.loop (Looper.java:164) на android.app.ActivityThread.main (ActivityThread.java:6709 ) в java.lang.reflect.Method.invoke (собственный метод) в com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:240) в com.android.internal.os.ZygoteInit.main (ZygoteInit .java: 769) Я много искал и не нашел ответа.
Я также получаю эту ошибку, если выполняю вызов API, помещаю приложение в фоновый режим, жду ответа, и когда я возвращаюсь в приложение, приложение вылетает из-за того, что я пытаюсь немедленно отобразить фрагмент диалогового окна (причина Я думаю, что это происходит из-за того, что транзакция воссоздания фрагмента при возврате из фона все еще выполняется во время отображения фрагмента диалога). Я решил это хакерским способом, установив задержку в 500 мс для диалога, потому что я не мог найти других решений.
Пожалуйста, спросите, нужны ли вам более подробные сведения по этому поводу. Заранее спасибо!
ВОЗМОЖНЫЕ ТЕМПЕРАТУРНЫЕ РЕШЕНИЯ
ИЗМЕНИТЬ. Я решил эту проблему, понизив зависимость совместимости приложений до androidx.appcompat:appcompat:1.0.2
, но это временное решение, так как мне придется обновить его в будущем. Надеюсь, кто-нибудь во всем разберется.
ИЗМЕНИТЬ 2. Я решил проблему, удалив setTransition () из транзакций фрагментов. По крайней мере, я знаю причину, по которой приложения для Android не имеют хороших переходов в целом
РЕДАКТИРОВАТЬ 3. Возможно, лучшее решение, чтобы избежать этой проблемы, а также обеспечить бесперебойную работу, - это просто использовать ViewPager для обработки нижней панели навигации.
fragments[]
? Я подозреваю, что проблема в том, что вы повторно используете фрагменты, а не каждый раз создаете новые. - person Ben P.   schedule 12.06.2019replace
для добавления фрагмента, который в настоящее время являетсяisRemoving
. - person EpicPandaForce   schedule 22.10.2019