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
としか言われないのでかなり苦労した。
バージョンの移り変わりが激しいと情報自体もバラバラなので情報収集が難しいのが難点。