読者です 読者をやめる 読者になる 読者になる

虚苦心観察ブログ

ブログ管理者である虚苦心が私利私欲に基づいて書いているブログです。主にガジェットのレビューだったり、画像処理のことだったりを記事にしています。

FragmentのレイアウトでViewPagerを使い、PagerAdapterにFragment(State)PagerAdapterを使う場合の注意点

題名のままですが、実際にはFragmentの中でFragmentを管理する場合の注意点です。

どういった状況で発生するかというと(私の場合)、
1. Parent1Fragmentの中でViewPagerを使ってChildAFragmentとChildBFragmentを表示します。
2. このParent1Fragmentから別のParent2Fragmentへ遷移します。
3. 戻るボタンでParent1Fragmentへ戻ります。

このような流れをとるとFragment(State)PagerAdapterへ与えたFragmentManagerがgetFragmentManager()メソッドから得たものだと、1.の状態が正常に復元されません。
Parent1Fragmentの状態だけが復元され、ChildAFragmentとChildBFragmentは復元されないという気持ち悪い状態に陥ります。

これはFragmentの中でFragmentを管理している場合に起こります。
またFragmentの状態の復元はFragmentの遷移が発生し、戻るボタンで元のFragmentへ戻った場合に発生します(他の場合もあるかも)。
FragmentA→FragmentB→(戻るボタン)→FragmentA というような移動の時に発生し、Homeボタンでアプリを終了したときには発生しないようです。

解決方法はgetChildFragmentManager()メソッドで別のFragmentManagerを用意すること。
これによりFragmentの管理が階層化され正常に復元がされるようになります。


getFragmentManagerを使おうがgetChildFragmentManagerを使おうがプログラム上は正常に動いてしまい何が原因だかわからず半日つぶしてしまいました。。。。
誰かの助けになれば幸いです。


参考
Fragmentをネストする際の注意点 - Just for Fun
Y.A.M の 雑記帳: Fragment in Fragment 時の注意点