ナビゲーションコンポーネントを利用した画面遷移コード
ナビゲーショングラフが作成できたので、ナビゲーションコンポーネントを利用した画面遷移コードを紹介します。
別のフラグメントへの遷移
まず、別のフラグメントに遷移して表示させるコードです。これは、リスト1の代わりとなるコードであり、Javaではリスト6のコードとなります。
NavController navController = NavHostFragment.findNavController(MemoListFragment.this); // (1) navController.navigate(R.id.action_memoListFragment_to_memoDetailFragment, arguments); // (2)
リスト1と比べると、非常にシンプルなコードになっています。
まず、ナビゲーションコンポーネントを利用する場合、その核となるクラスであるNavControllerのインスタンスを取得する必要があります。それが、リスト6の(1)のコードです。NavControllerをフラグメント内で取得する場合は、NavHostFragmentクラスのstaticメソッドであるfindNavController()を実行し、引数として、自身のフラグメントインスタンスを渡します。
NavControllerインスタンスが取得できたら、あとは(2)のように、アクションのidを引数にnavigate()メソッドを実行するだけです。メモリスト画面からメモ詳細画面へのアクションは、リスト5の(10)の通り、action_memoListFragment_to_memoDetailFragmentなので、このR値を引数として指定しています。
なお、navigate()メソッドには第2引数としてBundleオブジェクトを渡すことができます。これを利用すると、遷移先フラグメントにデータを渡すことができます。この仕組みは、通常のフラグメント間遷移と同様です。
このようなシンプルなコードだけで、バックスタックへの追加などフラグメント間遷移における注意点を全て自動で行ってくれます。
ここで、Kotlinコードも紹介しておきます。といっても、リスト6を単にKotlinコードに置き換えただけで、リスト7のコードとなります。
val navController = NavHostFragment.findNavController(this@MemoListFragment) navController.navigate(R.id.action_memoListFragment_to_memoDetailFragment, arguments)
元の画面に戻るコード
バックスタックからポップして元の画面に戻るコードに関しても、NavControllerを利用します。
これは、リスト2の代わりとなるコードであり、Javaではリスト8、Kotlinではリスト9のコードとなります。FragmentManagerを利用したコードと同名メソッドであるpopBackStack()を実行するだけです。
NavController navController = NavHostFragment.findNavController(MemoDetailFragment.this); navController.popBackStack();
val navController = NavHostFragment.findNavController(this@MemoDetailFragment) navController.popBackStack()
まとめ
Android Jetpackについて紹介していく本連載の第15回は、いかがでしたでしょうか。
今回は、画面遷移をまとめて管理できるナビゲーションコンポーネントの使い方を紹介しました。次回も、ナビゲーションコンポーネントを紹介する回であり、型安全にナビゲーションを行う方法、ナビゲーショングラフをKotlin DSLで定義する方法を紹介します。
