Cómo copiar la lógica de navegación de la aplicación de YouTube

Quiero implementar en mi aplicación la lógica de navegación como en la aplicación de Youtube. (BottomNavigationView + Gestión de fragmentos). Quiero esto, porque estos fragmentos son pesados, por lo que quiero que sean flojos, inicializados y luego almacenados en la pila, siento que YouTube lo está haciendo de esta manera. He implementado BottomNagivationView pero tengo problemas con Fragment Management.

Mi código:

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

donde Pages es enum

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

y aquí está mi función 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()
}

Y está funcionando, pero no tan bien como la aplicación de YouTube. La aplicación de YouTube tiene un comportamiento mágico, es decir, mantiene solo una transacción por cada fragmento, mientras que mi aplicación permite crear una pila de transacciones "infinita". ¿Tienes alguna idea de cómo funciona en la aplicación de YouTube?

Respuestas a la pregunta(3)

Su respuesta a la pregunta