プログラムで Navigation コンポーネントを操作する

Navigation コンポーネントは、特定のナビゲーション要素をプログラムで作成したり操作したりする方法を提供します。

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 ボタンの押下をインターセプトしたくない場合は、nullsetPrimaryNavigationFragment() にパスすることができます。

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 の概要をご覧ください。