Navigationの戻る制御

Kenji Abe
3 min readFeb 28, 2019

--

Navigationでバックキーを押したときに、どこまで戻るかを制御することが可能です。

これは何故かドキュメントに記載がありません。

環境

implementation "android.arch.navigation:navigation-fragment-ktx:1.0.0-rc02"
implementation "android.arch.navigation:navigation-ui-ktx:1.0.0-rc02"

サンプル

PopUpTo

バックキーを押したときにどこのFragmentまで戻るかを制御できます。

nav_graph.xmlでは次のように定義します。

action タグで対象の遷移先でバックキーを押されたときにどこまで戻るかを popUpTo で指定できます。

この例では、3つ目のFragmentでバックキーを押すと最初のFragmentまで戻ります。

Inclusive

もう一つ popUpToInclusive という設定があって、これにtrueにすると、 popUpTo で指定したFragmentの前のまで戻る設定なります。

この例だと、最初のFragmentより前に戻るので、最終的にActivityが閉じます。

例えば popUpToに2番目のFragment、popUpToInclusiveがtrueのときは最初のFragmentまで戻ります。

Navigation Editor

Navigation Editorからは設定したアクション(矢印の部分)を選択して、右側のAttributesの Pop Behavior から設定できます。

コード

次のように NavOptions を使ってコードから設定することも可能です。

もし、xmlにもpopUpToが設定されてる場合は、コードで設定されたものが優先されます。

actionによる戻る

action タグによる戻る処理を行うことができます。以下のように destination がない且つ popUpTo が指定されてるときに、そのactionに遷移するようにすると、 popUpTo に戻るのと同じ動きになります。

この例では、最初のFragmentまで戻ります。

コード側では普通にnavigateを呼び出すだけです。

仕組み

ざっくりとした仕組みですが、内部的にnavigateを呼び出したときに、遷移前に popBackStack してるだけです。

なので、遷移後にはすでに前のFragmentがBackStackからはなくなっています。

--

--

Kenji Abe

Programmer / Gamer / Google Developers Expert for Android, Kotlin / @STAR_ZERO