LoginSignup
2
1

More than 3 years have passed since last update.

FragmentStatePagerAdapterの復元処理でハマった話

Posted at

起こった事象

Activityが破棄された時、FragmentStatePagerAdapterのデータが残っているため、
Fragmentに対して直接指示する時に内部変数が初期化されてない状態になっている。
そのため、呼び出し行うとクラッシュする。

対処方法

保存の流れとして、
onSaveInstanceState -> onDestroy -> onRestoreInstanceState
のため、onRestoreInstanceState
FragmentStatePagerAdapterのfragmentManagerのデータを削除する。

データを削除し、改めてonCreateから生成し直せばいい。

誤った対処

メモリ破棄できてないから、きちんと破棄すればいい。という思考だけで、対応しようとしてしまった。

破棄処理のonDestroyでクリア処理を追加する形にしたが上手くいかなかったため、
破棄する方法が違うと思って、あれやこれや(※1)と試してやってしまった。。
が、先に書いた"対処方法"の通り、いい感じに消し込めたとしても、
FragmentStatePagerAdapteronRestoreInstanceStateをいい感じに実行するため復元されてしまう。
ので、消し込み処理が意味ないものとなっていた。

(※1)
OnDestroyのタイミングで、
viewPagerをリセットしたり、FragmentStatePagerAdapterのデータを空にし通知したり、
framentManagerのfragmentを全て破棄したり、FragmentStatePagerAdapterの渡すf配列のfragmentをWeakReferenceにしたり
FragmentStatePagerAdapterをFragmentPagerAdapterにしたり..etc..

まとめ

破棄時のライフサイクルを意識しきれてなかったのと、
FragmentStatePagerAdapterの理解度が浅かったのものあるが無駄にハマった。
「破棄しきれてないから破棄すればいいじゃん」というバイアスが取れないと詰みます。
みなさんこうならないようにしてくださいw

おまけ

前ふりをよく書いてたけど、やめようと思う。
コンテンツがストーリー的になってないなら結論言った方が早いよねと・・・
テンション高まった時だけにしよう:frowning2:

2
1
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
2
1