• スポンサードリンク

いまさらだけどPreferenceFragmentCompatでインナーPreferenceScreenを使うと自動では画面遷移できない件

Android

いまさらだけどPreferenceFragmentCompatでインナーPreferenceScreenを使うと自動で画面遷移しない件、ぐるぐる先生に聞くとPreferenceFragmentCompatを継承してゴニョゴニョしてさらにActivityにもOnPreferenceStartFragmentCallbackインターフェースやらOnPreferenceStartScreenCallbackインターフェースやらを実装せよとおっしゃられる、めんどくさいんじゃぁー?そもそも処理があっちこっちに散らかっていやなんじゃぁー(T T)

でもPreferences画面がxmlだけで完結している前提ならもう少し簡単な方法がありました\(^o^)/
しかもPreferenceFragmentCompatを継承して#onNavigateToScreenをoverrideするだけ(@@)

自分自身以外のFragmentクラスを使いたければフラグメントを生成している部分を書き換えます。前のコードスニペットでは次のようにして自分自身と同じFramgnetを生成しています。

例えば次のようにすると好きなFragmentを生成して画面遷移できるのですじゃ〜

あとreplaceのときのコンテナidは上のスニペットだとR.id.containerに固定しているけど、もし変えたければそれもBundleに突っ込んでsetArgumentsで引き渡せばよいのじゃ、簡単なのじゃ

あっ、でも1つ制限が。xmlのPreferenceScreenにもダミーでユニークなキーを設定しておく必要があります。でないとキーがnullになってしまうので、トップレベルのPreferenceScreenしか表示できません。

1つ目のインナーPreferenceScreen(preference_screen_1)は普通にxmlでPrefarenceを定義したもの、2つ目(preference_screen_notice)は静的なテキスト/画像等を表示するだけのレイアウトリソースを参照して表示するインナーPreferenceScreenなのですじゃ。

この方法の利点は、

  • コードが散らからない(PreferenceFragmentCompat#onNavigateToScreenをoverrideするだけ)
  • サポートライブラリ版ではない通常のPreferenceFragmentとほぼ同じxmlが使える。
    SwitchPreferenceはSwitchPreferenceCompatに置き換えないといけないとかはあるけど
  • バックキーの処理を自動でしてくれる(通常のPrefereceFragmentと同じ使い勝手)

ところでListPreferenceはサポートライブラリ版でもフレームワーク版でも同じ名前なのにSwitchPreferenceはSwitchPreferenceCompatに置き換えないといけないのはなんでなんじゃ?

ということで短いけど、今日はさよならなのじゃぁー、金曜日は温泉に行く日なのじゃぁー♨

« »

  • スポンサードリンク