Navigation コンポーネントは、特定のナビゲーション要素をプログラムで作成したり操作したりする方法を提供します。
NavHostFragment を作成する
NavHostFragment.create()
を使用して、特定のグラフリソースで NavHostFragment
を作成できます。たとえば、以下の通りです。
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();
setPrimaryNavigationFragment(finalHost)
を使用すると、NavHost
でシステムの Back ボタンの押下をインターセプトしますので、注意してください。app:defaultNavHost="true"
を追加することにより、NavHost
XML でこの動作を実装することもできます。カスタムの Back ボタンの動作 を実装しており、NavHost
で Back ボタンの押下をインターセプトしたくない場合は、null
を setPrimaryNavigationFragment()
にパスすることができます。
ViewModel を使用してデスティネーション同士で UI 関連データを共有する
バージョン 2.1.0-alpha02 以降では、ナビゲーション グラフにスコープされる ViewModel
を作成できます。これにより、グラフのデスティネーション同士で UI 関連データを共有できます。この方法で作成された ViewModel
オブジェクトは、関連付けられた NavHost
とその ViewModelStore
がクリアされるか、ナビゲーション グラフがバックスタックからポップされるまで有効です。
ナビゲーション グラフにスコープされる ViewModel
を取得する方法は、以下の通りです。
Kotlin
Kotlin では、navGraphViewModels()
のプロパティ デリゲートを使用して、フラグメント デスティネーション内から ViewModel
を取得できます。
val factory: ViewModelProviderFactory = ... val viewModel: MyViewModel by navGraphViewModels(R.id.my_graph) { factory }
この例では、by navGraphViewModels()
が自動的に findNavController()
を呼び出して、関連付けられた NavController
を取得しています。
Java
ViewModelProviderFactory factory = ... ViewModelStoreOwner owner = navController.getViewModelStoreOwner(R.id.my_graph); MyViewModel viewModel = new ViewModelProvider(owner, factory);
ViewModel
の詳細については、ViewModel の概要をご覧ください。