やりたいこと
NavigationComponentでstartDirectionにあるFragmentへ一気に戻りたい場合、皆さんGlobal Actionを使っているのではないでしょうか。
私もこのGlobal Actionで戻るように書いたのですが、例えばstartDirectionのHogeListFragment
がRecyclerViewのscrollableなViewで、スクロール位置などの状態を保ちたい場合は、Global Actionだと難しいです。
例えば以下のようなGlobal Actionがあるとすると、
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/hoge_nav"
app:startDestination="@id/hoge_list_fragment">
...
<action android:id="@+id/action_global_hoge_list_fragment"
app:destination="@id/hoge_list_fragment"
app:popUpTo="@id/hoge_nav"
app:popUpToInclusive="true"/>
</navigation>
viewTransactionButton.setOnClickListener { view ->
view.findNavController().navigate(R.id.action_global_hoge_list_fragment)
}
viewTransactionButton
を押すことでGlobal Actionaction_global_hoge_list_fragment
が実行され、hoge_nav
のsequenceにPopUpします。
ぱっと見良さそうですが、これだとHogeListFragment
は再生成されたものが表示されるため、状態はリセットされてしまいます。
解決
この場合Global Actionは使わず、以下のようにするだけで実現できます。
viewTransactionButton.setOnClickListener { view ->
view.findNavController().popBackStack(R.id.hoge_list_fragment, false)
}
このようにBackStackからpopすることで状態の残っているHogeListFragment
へ戻ることができます。
第二引数のinclusive
はtrueにすると、指定された宛先(HogeListFragment
)もpopされるため別の画面に遷移できなくなるので注意です。