AndroidX Preference Libraryを利用して設定画面を作成する
Android Jetpack コンポーネントの一つであるAndroidX Preference Libraryを利用して、設定画面を作成する方法について紹介します。
URLメモで、設定画面からテーマ(システム設定に従う/ライト/ダーク)の変更をできるようにしたので、それを題材にして説明します。
ちなみに、ダークテーマへの変更については、こちらで紹介しています。
実装手順は以下を参考にしています。
環境設定
build.gradleに次の依存性を追加します。
implementation "androidx.preference:preference-ktx:1.1.0"
リソースを作成する
設定画面のxmlを作成します。
リソースの新規作成で、Resource TypeをXMLに設定することで作成できます。
今回は、下記の設定画面のxmlを作成しました。
設定画面のxmlと実際表示される画面との対応をまとめると次のようになります。
以下、設定画面のxmlについて補足説明します。
詳細を知りたい場合は、こちらを参照ください。
PreferenceCategory
設定のグループを視覚的に分けて表示するための属性です。今回は「テーマ設定」と表示させています。
ListPreference
設定値を選択肢の中から一つ選択させるための属性です。ラジオボタンで構成されたダイアログが表示されます。
ダイアログ中の選択肢はentriesで設定します。今回でいうと、「システム設定に従う/ライト/ダーク」です。
そして、設定値はentryValuesで設定します。こちらが、Preferenceに保存される値となります。
entriesとentryValuesに設定する値は、arraysリソースで定義します。
entriesとentryValuesは配列のインデックスで対応しているので、entriesとentryValuesのitem数は等しくしてください。
対応しているとは、今回でいうとダイアログで3番目に表示されている「ダーク」を選択すると、entryValuesの3番目のitemの値(=2)がPreferenceに保存されるということです。
また、ダイアログで選択したラベルを設定項目の下に表示させる場合は、useSimpleSummaryProvider=true
を設定します。
設定画面をinflateする
PreferenceFragmentCompatを継承したFragmentを作成します。
そして、onCreatePreferencesをoverrideしてsetPreferencesFromResourceメソッドに、設定画面のxmlのリソースIDを渡します。
URLメモでは次のように実装しました。
Preferenceの設定値が変更された時に、何か処理をしたい場合は、Preference#setOnPreferenceChangeListenerを利用します。
設定画面のxmlで定義したPreferenceは、findPreferenceメソッドで取得できます。引数には取得したいPreferenceのkey(設定画面のxmlのapp:keyの属性値)をセットして下さい。
URLメモでは、Preference#setOnPreferenceChangeListenerにテーマを変更する処理をセットしています。
設定画面に遷移する
URLメモでは、onOptionsItemSelectedをoverrideして、メニューを押下した時に設定画面に遷移するようにしました。
Navigationを利用しているので、新しくActionも追加しています。
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.settingsFragment -> {
findNavController().navigate(
UrlMemoListFragmentDirections
.actionUrlMemoListFragmentToSettingsFragment()
)
return true
}
else -> return super.onOptionsItemSelected(item)
}
}
設定値を取得する
Preferenceの設定値は、次のように取得できます。
SharedPreferences#getStringの第一引数がPreferenceのkeyで、第二引数がPreferenceが存在していなかった時に返す値です。
val themePreference = PreferenceManager
.getDefaultSharedPreferences(context)
val id = themePreference
.getString("theme", ThemeEnum.MODE_NIGHT_FOLLOW_SYSTEM.id)
ちなみに、URLメモは起動時にテーマを変更させるために、設定画面で設定したPreferenceの設定値を取得して、その値に応じてテーマを変更させています。
ThemeEnumは、Preferenceの設定値とナイトモードを対応させるために作成しています。
ThemeSettingは、テーマを切替える処理をするために作成しています。
今回は、AndroidX Preference Libraryを利用して設定画面を作成する方法について紹介しました。