Cómo interactuar de forma programática con el componente Navigation

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.