Я хочу реализовать в своем приложении логику навигации, как в приложении Youtube. (BottomNavigationView + управление фрагментами). Я хочу этого, потому что эти фрагменты тяжелые, поэтому я хочу, чтобы они были лениво инициализированы, а затем сохранены в бэкстеке, я чувствую, что YouTube делает это таким образом. Я реализовал BottomNagivationView, но у меня проблемы с управлением фрагментами.
Мой код:
bottomNavigationView.setOnTabSelectedListener { position, _ ->
setFragment(OnlinePageFragment.Page.values()[position])
}
где страницы перечисляются
enum class Page(index: Int, val klass: Class<*>) {
ONE(0, OnePageFragment::class.java),
TWO(1, TwoPageFragment::class.java),
THREE(2, ThreePageFragment::class.java)
}
и вот моя функция setFragment
fun setFragment(page: OnlinePageFragment.Page) {
var fragment: Fragment? = supportFragmentManager.findFragmentByTag(page.klass.name)
val tag = page.klass.name
if (fragment == null)
fragment = OnlinePageFragment.newInstance(page, null)
val ft = supportFragmentManager.beginTransaction()
with(ft) {
replace(R.id.fragmentContainer, fragment, tag)
addToBackStack(tag)
commit()
}
}
override fun onBackPressed() {
if (supportFragmentManager.backStackEntryCount == 1) finish()
else super.onBackPressed()
}
И это работает, но не так хорошо, как приложение YouTube. Приложение YouTube имеет какое-то волшебное поведение, т.е. оно сохраняет только одну транзакцию для каждого фрагмента, в то время как мое приложение позволяет создавать «бесконечный» бэкстек транзакций. У вас есть идеи, как это работает в приложении YouTube?