проблема
Я использую BottomNavigationView
из библиотеки поддержки дизайна Android в одном из моих занятий, а также фрагменты для каждого элемента навигации.
Каждый раз, когда я выбираю элемент на панели, я выполняю транзакцию фрагмента, как показано ниже (фрагмент кода был удален для краткости):
private var fragmentToSet: Fragment? = null
private val onNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
fragmentToSet = when (item.itemId) {
// Choose fragment based on selection
// ...
}
// ...
supportFragmentManager.beginTransaction()
.replace(R.id.container, fragmentToSet)
.commit()
}
Проблема в том, что ... Анимация нижней панели становится очень медленной и заканчивается только после полной загрузки фрагмента и его отображения на экране.
Эта проблема не совсем новая , поскольку она также может возникать при использовании меню навигации, но, по крайней мере, ее можно решить с помощью DrawerLayout.DrawerListener
и выполнить фактическую транзакцию фрагмента только после ящика закрыто.
Что я пробовал до сих пор
Я пытался «кэшировать» фрагменты, удерживая их ссылки, чтобы избежать повторного создания объектов каждый раз (например, MyFragment.newInstance()
), но это не сработало.
Я также пытался использовать обработчики, которые вроде решили проблему, но в некоторых случаях это могло привести к исключению . Нечто похожее на фрагмент ниже:
handler.postDelayed({changeFragment(fragmentToSet!!)}, 200)
Есть ли способ решить эту проблему без использования обработчиков (или других асинхронных вызовов), аналогично этому решению при использовании меню навигации?