AndroidX Preference Libraryを利用して設定画面を作成する

Keisuke Kawajiri
URL Memo
Published in
6 min readJan 8, 2020

--

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を利用して設定画面を作成する方法について紹介しました。

--

--