Android
Fragment
ViewPager
HALDay 21

ViewPager + Fragmentを使った時に起きた困った動作

tl;dr

ViewPagerの中でFragmentを使う時は場合によってFragmentの再生成が行われないので思った通りに動作しないことがあるので注意する。

実際に起こった動作

言葉では説明しづらいので以下のgifをご覧ください
sample.gif

どうでもいいんですが、この動作ってググるときになんてキーワードでググれば良いか難しい

原因

どうやらナビゲーションを切り替えた時にViewPagerの中にあるFragmentが再生成されずに使いまわされているから起こるらしい。

解決策

以下のようなFragmentPagerAdapter部分をFragmentStatePagerAdapterにするとFragmentが再生成されるようになり正しく動作します。

// 修正前
val adapter = object: FragmentPagerAdapter(fragmentManager)
// 修正後
val adapter = object: FragmentStatePagerAdapter(fragmentManager)

この他にもonDestroyViewなどのタイミングで利用しているadapterにnullをセットしても正しい動作になります。
ただし、nullをセットするadapterがフラグメント内にあったりするとフラグメントのトランザクションがコミットされた後にフラグメントを操作しようとするためエラーを吐くことがあります。

最後に

この動きを解決するときにググってもピンポイントで解決策が出てこなくて(根本的になんてググれば良いかもよく解らなかった)解決にちょっと手間取ったので、この記事を見て少しでも解決しやすくなると嬉しいです。
Androidって難しい