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.