このGWはPLVのあまりにもアレなコードを手直し(下の画像参照)していたのだけれど、そこで知見を得たので書きます。
ActionbarのTabを分ける方式はもう古いということでGoogle様にdeprecatedにされてしまったので、ViewPagerで頑張ることにしました。
FragmentPagerAdapter
を使うまではよかったのですが、設定値を少しでも変えると落ちてしまいます。どうやらPreferenceFragment
を自分で設定値が見れるようにカスタムしているとこがいけないらしい。
そこでエラーログを見ると'boolean android.preference.Preference.hasKey()' on a null object reference
とのことで、どうやらfindPreference
で見つけられてないっぽい。
でもタブのときは大丈夫だったはずなんだけどなあ...ということで数時間悩んでいたのですが、解決しました。
onSharedPreferenceChanged
は、ViewPagerにある他のPreferenceFragment
にも呼ばれる ことが原因でした。
要するに、ある設定を変えた時に他の設定画面でもfindPreference
がよばれていたため、その画面ではfindPreference
してもnull
が返って来たということです。
なので、findPreference
の結果がnull
かどうかのチェックを挟めばOKでした。(commit)
それと、あるSwitchPreference
が変更されたらViewPagerからFragmentを取り除くことをしていたのですが、取り除いても上のバーは消えるけどスワイプしたら微妙に画面が残ってしまっているという現象に遭遇しました。
なんかタブ削除されてても残っててじわる pic.twitter.com/LpIyraOz9d
— うにゃ(のにれん(うにゃ)) (@nonylene) 2015, 5月 3
これはFragmentPagerAdapter
がキャッシュしているのが原因で、毎回リセットするようにしてあげたらちゃんとなりました。(commit, 参考サイト)