起こった事象
Activityが破棄された時、FragmentStatePagerAdapterのデータが残っているため、
Fragmentに対して直接指示する時に内部変数が初期化されてない状態になっている。
そのため、呼び出し行うとクラッシュする。
対処方法
保存の流れとして、
onSaveInstanceState
-> onDestroy
-> onRestoreInstanceState
のため、onRestoreInstanceState
で
FragmentStatePagerAdapterのfragmentManager
のデータを削除する。
データを削除し、改めてonCreate
から生成し直せばいい。
誤った対処
メモリ破棄できてないから、きちんと破棄すればいい。という思考だけで、対応しようとしてしまった。
破棄処理のonDestroy
でクリア処理を追加する形にしたが上手くいかなかったため、
破棄する方法が違うと思って、あれやこれや(※1)と試してやってしまった。。
が、先に書いた"対処方法"の通り、いい感じに消し込めたとしても、
FragmentStatePagerAdapter
がonRestoreInstanceState
をいい感じに実行するため復元されてしまう。
ので、消し込み処理が意味ないものとなっていた。
(※1)
OnDestroyのタイミングで、
viewPagerをリセットしたり、FragmentStatePagerAdapterのデータを空にし通知したり、
framentManagerのfragmentを全て破棄したり、FragmentStatePagerAdapterの渡すf配列のfragmentをWeakReferenceにしたり
FragmentStatePagerAdapterをFragmentPagerAdapterにしたり..etc..
まとめ
破棄時のライフサイクルを意識しきれてなかったのと、
FragmentStatePagerAdapterの理解度が浅かったのものあるが無駄にハマった。
「破棄しきれてないから破棄すればいいじゃん」というバイアスが取れないと詰みます。
みなさんこうならないようにしてくださいw
おまけ
前ふりをよく書いてたけど、やめようと思う。
コンテンツがストーリー的になってないなら結論言った方が早いよねと・・・
テンション高まった時だけにしよう