1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Androidの画面遷移にNavigationを利用する

Posted at

Navigation

Android用の画面遷移ライブラリ
XMLで画面と画面間の接続を定義し、コードから呼び出して利用する
ActivitystartActivity,startActivityForResultFragmentFragmentManagerを利用する方法だと、
ActivityFragmentを確認しないと画面同士の繋がりを把握できないが、
Navigationを利用する場合XMLファイルを確認するだけで把握することができる

準備

https://developer.android.com/guide/navigation/navigation-getting-started
に従う

SafeArgsと併用すると便利

使い所

基本的に画面遷移はこれで実装すると良い
ActivityFragmentManagerは扱いがめんどくさいのでActivityを1つだけ用意し、
Fragmentの遷移で画面遷移を実装するのが楽
SingleActivityとか呼ばれるパターンらしい。Jake Warthonさんもこれがいいって言ってたらしい
ActivityContextのリークとかにあまり気を使わなくてよくなるのも良い
20以上は画面があるようなアプリで利用してみたが、特に大きな問題なく利用できた

ChromeCastを利用する場合は注意が必要
Googleのガイドライン での必須要素として、通知領域の実装と通知領域からのExpandedControllerの実装が必要とされている
これを実装するためのAPIはsetExpandedControllerActivityClassNameとなっていて、起動されるActivity名を指定することになる
SingleActivityの場合、特定の画面を指定できないので、特別な調整が必要となる

複数のNavigation

NavigationのXMLは1つである必要はないので、アプリケーション内に複数あっても問題ない
例えば、2022時点のPlayStoreのようなアプリで考えると、大きく2つのNavigationになる
BottomNavigationをタップしたときの遷移のNavigationと
コンテンツをタップしたときに遷移する詳細画面や設定画面への遷移のような画面全体のNavigationのような感じ
ただし、BottomNavigationとバックキーの挙動には注意が必要
私的には。バックキーでアプリが終了する前にBottonNavigationの一番左にフォーカスが移動するタイプが好き
場合によっては、Navigationを使用せずに実装することも視野に入れる 

SafeArgsの利用

SafeArgsを利用してNavigationActionを記述すると、XXXDirectionsというクラスが生成される
argumentsも合わせて、idを利用した遷移より安全なので、利用すると良い

NavigationとDialogFragmentの注意点

DialogFragmentも記述できるが少々工夫が必要だったので、無理に利用しないほうが良いかもしれない
targetFragmentを利用してDialogFragmentの結果で遷移するとクラッシュしたりした記憶がある
currentDestinationとの整合性のとり方が意外と難しい
その他、DialogFragmentが多重に表示されたりする
私の設計では、DialogFragmentは通常通りにFragmentManagerを利用して表示するほうが調整しやすかった
Navigationと混在しても問題はあまり発生しない模様

画面遷移と関数

画面遷移を一種の関数として考えると、わかりやすくなる場合がある
コンテンツの購入画面やログイン画面、ダイアログ的に利用する画面がそれに当たることが多い
コンテンツの購入画面は購入対象のコンテンツのIDを必要とし、コンテンツの購入結果を遷移元画面に返却すると考えるとわかりやすい
擬似的にコードっぽくすると以下のようになる

fun navigateToPurchase(contentId: String): Boolean

contentId: Stringの部分は、NavigationSafeArgsを利用すると作りやすい
Booleanを返却する部分は、先に書いた方法では作成できないので、
NavBackStackEntry#savedStateHandleを利用すると、遷移先のFragmentから遷移元に値を返せるようなので、
これを利用すると良さそう

NavBackStackEntryを使った実装は本番で利用したことがないので、使うことがあればまた書きたい

その他

DeepLinkとかの機能もあるけど利用したことはない

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?