3
0

More than 3 years have passed since last update.

NavigationComponentで画面の状態を保存したままstartDirectionに戻る方法

Posted at

やりたいこと

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されるため別の画面に遷移できなくなるので注意です。

3
0
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
3
0