事象
NestedScrollViewを利用したFragmentから、別のFragmentに遷移してpopBack
したとき、スクロール位置が復元されず、一番上に戻ってしまう。
解決方法
NestedScrollViewに(xmlレイアウトファイル内で)id
を指定する。
たったこれだけです。
なお、本アプリは、1Activity上で複数のFragment遷移だけを行う構成になっています。
<androidx.core.widget.NestedScrollView
android:id="@+id/nested_scroll_view" <!-- これを追加 -->
補足
当初は、わざわざonPause
でscrollY
をViewModelに保存して(※)、onViewCreated
で値が設定されていればscrollY
に再セットして無理矢理スクロールさせる、なんてことをしていましたが、それを通過しないフローがあったにもかかわらず復元できるようになっていることに気づき、最終的に「idを追加してやると保存/復元フローが自動で走るようになるらしい」との結論に至りました。
コードから利用する必要が無く、constraintの対象にもならないようなViewだとidは付けないままにしてしまうことが多いと思いますが、意外にそれが盲点になることがあるようですね。
※FragmentAからFragmentBに遷移するとき、FragmentA自体は破棄され、戻ったときに再作成されますが、ViewModelはメモリ上に残っているようだったのでこのようにしていました。