El componente Navigation ofrece maneras de crear determinados elementos de navegación e interactuar con ellos de forma programática.
Crear un NavHostFragment
Puedes usar NavHostFragment.create()
para crear de forma programática un NavHostFragment
con un recurso de gráfico específico, como se muestra en el siguiente ejemplo:
Kotlin
val finalHost = NavHostFragment.create(R.navigation.example_graph) supportFragmentManager.beginTransaction() .replace(R.id.nav_host, finalHost) .setPrimaryNavigationFragment(finalHost) // this is the equivalent to app:defaultNavHost="true" .commit()
Java
NavHostFragment finalHost = NavHostFragment.create(R.navigation.example_graph); getSupportFragmentManager().beginTransaction() .replace(R.id.nav_host, finalHost) .setPrimaryNavigationFragment(finalHost) // this is the equivalent to app:defaultNavHost="true" .commit();
Ten presente que setPrimaryNavigationFragment(finalHost)
permite que el NavHost
intercepte las activaciones del botón Atrás del sistema. También puedes implementar este comportamiento en el XML del NavHost
agregando app:defaultNavHost="true"
. Si implementas un comportamiento del botón Atrás personalizado y no quieres que el NavHost
intercepte las activaciones del botón Atrás, puedes pasar null
a setPrimaryNavigationFragment()
.
Compartir datos relacionados con la IU entre destinos con ViewModel
A partir de la versión 2.1.0-alpha02, puedes crear un ViewModel
definido según un gráfico de navegación, lo que te permite compartir datos relacionados con la IU entre los destinos del gráfico. Todo objeto ViewModel
creado de esta manera está activado hasta que el NavHost
asociado y su ViewModelStore
se borren o hasta que el gráfico de navegación salga de la pila de actividades.
En el siguiente ejemplo se muestra cómo recuperar un ViewModel
definido según un gráfico de navegación:
Kotlin
En Kotlin, puedes usar el delegado de propiedad navGraphViewModels()
para recuperar un ViewModel
del destino del fragmento:
val factory: ViewModelProviderFactory = ... val viewModel: MyViewModel by navGraphViewModels(R.id.my_graph) { factory }
Cabe señalar que, en este ejemplo, by navGraphViewModels()
hace una llamada a findNavController()
automáticamente para recuperar el NavController
asociado.
Java
ViewModelProviderFactory factory = ... ViewModelStoreOwner owner = navController.getViewModelStoreOwner(R.id.my_graph); MyViewModel viewModel = new ViewModelProvider(owner, factory);
Para obtener más información acerca de ViewModel
, consulta Descripción general de ViewModel.