Como copiar a lógica de navegação de aplicativos do YouTube

Quero implementar na lógica de navegação do meu aplicativo, como no aplicativo do Youtube. (BottomNavigationView + gerenciamento de fragmentos). Eu quero isso, porque esses fragmentos são pesados, então eu quero que eles sejam inicializados preguiçosamente e depois armazenados no backstack, sinto que o YouTube está fazendo dessa maneira. Eu implementei o BottomNagivationView, mas tenho problemas com o Gerenciamento de fragmentos.

Meu código:

bottomNavigationView.setOnTabSelectedListener { position, _ -> 
    setFragment(OnlinePageFragment.Page.values()[position])
}

onde Pages é enum

enum class Page(index: Int, val klass: Class<*>) {
        ONE(0, OnePageFragment::class.java),
        TWO(1, TwoPageFragment::class.java),
        THREE(2, ThreePageFragment::class.java)
    }

e aqui está minha função 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()
}

E está funcionando, mas não é tão bom quanto o aplicativo do YouTube. O aplicativo do YouTube tem algum comportamento mágico, ou seja, mantém apenas uma transação por cada fragmento, enquanto meu aplicativo permite criar um backstack "infinito" de transações. Você tem alguma idéia de como isso funciona no aplicativo do YouTube?

questionAnswers(3)

yourAnswerToTheQuestion