Unyablog.

のにれんのブログ

PreferenceFragmentとViewPagerのお話

このGWはPLVのあまりにもアレなコードを手直し(下の画像参照)していたのだけれど、そこで知見を得たので書きます。

Gyazo

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を取り除くことをしていたのですが、取り除いても上のバーは消えるけどスワイプしたら微妙に画面が残ってしまっているという現象に遭遇しました。

これはFragmentPagerAdapterがキャッシュしているのが原因で、毎回リセットするようにしてあげたらちゃんとなりました。(commit, 参考サイト)