Interagir programaticamente com o componente de navegação

O componente de navegação oferece maneiras de criar e interagir programaticamente com determinados elementos de navegação.

Criar um NavHostFragment

É possível usar NavHostFragment.create() para criar programaticamente um NavHostFragment com um recurso gráfico específico, conforme demonstrado no exemplo abaixo:

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();

É importante lembrar que setPrimaryNavigationFragment(finalHost) permite que o NavHost intercepte os pressionamentos do botão Voltar. Você também pode implementar esse comportamento no seu XML NavHost. Para isso, adicione app:defaultNavHost="true". Caso esteja implementando um comportamento personalizado do botão Voltar e não queira que o NavHost intercepte os pressionamentos do botão Voltar, você pode passar null para setPrimaryNavigationFragment().

Compartilhar dados relacionados à IU entre destinos com ViewModel

A partir da versão 2.1.0-alpha02, é possível criar um ViewModel com escopo de gráfico de navegação. Isso permite que você compartilhe dados relacionados à IU entre os destinos do gráfico. Quaisquer objetos ViewModel criados dessa forma são válidos até que o NavHost e o ViewModelStore sejam eliminados ou que o gráfico de navegação seja retirado da pilha de retorno.

O exemplo a seguir mostra como recuperar um ViewModel com escopo de gráfico de navegação:

Kotlin

No Kotlin, é possível usar a propriedade navGraphViewModels() delegada para recuperar um ViewModel de dentro de um destino de fragmento:

val factory: ViewModelProviderFactory = ...
val viewModel: MyViewModel
    by navGraphViewModels(R.id.my_graph) { factory }

Nesse exemplo, by navGraphViewModels() chama automaticamente findNavController() para recuperar o NavController associado.

Java

ViewModelProviderFactory factory = ...
ViewModelStoreOwner owner = navController.getViewModelStoreOwner(R.id.my_graph);
MyViewModel viewModel = new ViewModelProvider(owner, factory);

Para mais informações sobre ViewModel, consulte a Visão geral do ViewModel.