¿Cómo cargar el fragment en BottomNavigationView dependiendo del elemento seleccionado?

Tengo una aplicación simple escrita en Kotlin que tiene un BottomNavigationView. La idea es tener una sola actividad (MainActivity) con un fragment que se cargará para cada pestaña en BottomNavigationView.

Ya he creado un fragment que me gustaría cargar cuando se selecciona una pestaña (HomeFragment) y ya estoy cambiando el text debajo de los íconos en BottomNavigationView cuando la pestaña activa cambia.

Ahora me gustaría inflar / cargar el fragment cuando cambio las tabs. ¿Cómo voy a hacer esto?

MainActivity.kt:

class MainActivity : AppCompatActivity() { private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item -> when (item.itemId) { R.id.navigation_enrollments -> { message.setText(R.string.title_enrollments) return@OnNavigationItemSelectedListener true } R.id.navigation_timeline -> { message.setText(R.string.title_timeline) return@OnNavigationItemSelectedListener true } R.id.navigation_home -> { message.setText(R.string.title_home) return@OnNavigationItemSelectedListener true } R.id.navigation_alerts -> { message.setText(R.string.title_alerts) return@OnNavigationItemSelectedListener true } R.id.navigation_profile -> { message.setText(R.string.title_profile) return@OnNavigationItemSelectedListener true } } false } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener) } override fun onResume() { super.onResume() setContentView(R.layout.activity_main) val bottomNavigationView = findViewById<BottomNavigationView>(R.id.navigation) bottomNavigationView.selectedItemId = R.id.navigation_home } } 

En lugar de message.setText(R.string.title_enrollments) do

 supportFragmentManager.beginTransaction() .replace(containerViewId, fragmentInstance, "TAG") .commitAllowingStateLoss() 

O puede usar una function de extensión que uso en mi código para hacerlo más limpio. Solo agrega esto en algún file .kt

 inline fun FragmentManager.transactStateless(func: FragmentTransaction.() -> Unit) { val transaction = beginTransaction() transaction.func() transaction.commitAllowingStateLoss() } 

y ahora puedes agregar eliminar fragment de esta manera:

 supportFragmentManager.transactStateless { replace(containerViewId, fragmentInstance, "TAG") } 
  • Interfaz de Dagger Inject en la class base
  • Haga clic en el elemento RecyclerView en ViewHolder
  • ¿Cómo configurar Jacoco con Spek en un proyecto múltiple?
  • Respuesta fragmentada de Vert.x con los datos de la database usando BLOB e hibernación
  • ir a la statement en create-react-kotlin-app no ​​funciona
  • Kotlin: Alcance interno: este
  • Anular setter para la variable definida en el constructor pnetworkingeterminado
  • Obtuvo NoClassDefFoundError al pasar el map de lambda
  • ¿Por qué mi aplicación solo funciona cuando asigno una cadena a la variable directamente en un código cuando uso la function OpenFileInput / Ouput?
  • ¿Cuál es la solución adecuada para @BeforeAll en Kotlin?
  • Función para expresión lambda