PreferenceFragmentCompatの実装

かなり詰まらせられたので記録。
殴り書きなので時間があれば書き直す。


実装

PreferenceFragmentを継承して

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    addPreferencesFromResource(R.xml.preferences)
}

として実装。

FragmentPagerAdapterを使っておりGetItemでのFragmentの型が違うと怒られる。 調べると、PreferenceFragmentCompatはその辺の変換等も行なってくれるらしいのでそれに変更。 onCreateを削除し以下に変更。

override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
    addPreferencesFromResource(R.xml.preferences)
}

preferences.xml

resディレクトリにxmlディレクトリを追加。 xml中にpreferences.xmlを追加 ルートはPreferenceScreenで適当に設定項目を追加

Must specify preferenceTheme in theme

ここが一番苦しめられた。 結論としてはAndroidManifest.xmlのactivityにthemeが設定されていなかったため、後述の何をしても無駄だった。 AndroidManifestのactivityの項目にthmeが設定されていなければ、

<activity
    android:name=".MainActivity"
    android:screenOrientation="portrait"
    android:theme="@style/AppTheme">

のようにthemeを追加する。 ただし、呼び出すスタイルにはpreferenceThemeを設定しておくこと。 こうすることで実行できるようになる。

やったこと

  • 参考にした様々なページの通りstyle.xmlのAppThemeスタイルに<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>を追加
  • 適当な名前でスタイルを追加そこにpreferenceThemeを追加
  • AppTheme,独自定義のテーマのparentをAndroidManifestで設定されているthemeに変更
  • PreferenceThemeOverlayのスタイルを上書き
  • AndroidManifestで設定しているテーマを変更してみる

正解

改めて正解を - style.xmlのAppThemeに<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>を追加 - AndroidManifestのactivityにandroid:theme="@style/AppTheme"を追加

終わりに

出来てみれば大したことないのに、エラーログではMust specify preferenceTheme in themeとしか言われないのでかなり苦労した。 バージョンの移り変わりが激しいと情報自体もバラバラなので情報収集が難しいのが難点。