しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

PreferenceFragmentCompatで設定画面を作成する

PreferenceFragmentCompatという設定画面作成用のコンポーネントを試してみました。

まずはbuild.gradleでライブラリを追加します。

implementation 'androidx.preference:preference:1.2.0'

次は設定画面用のXMLを作成します。
res/xmlにpreferences.xmlというファイルを作成して下のようにします。

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory android:title="設定1">
        <CheckBoxPreference
            android:key="notifications"
            android:title="通知を有効にする"
            android:defaultValue="true" />
    </PreferenceCategory>
</PreferenceScreen>

次は下のように設定画面用のFragmentを作成します。

class MySettingFragment: PreferenceFragmentCompat() {
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.preferences, rootKey)
    }
}

これでアプリを起動すると下のように設定画面が表示されます。
ここでチェックのON/OFF切り替えをするとSharedPreferencesにデータが保存されます。

保存されたデータは下のように取得する事ができます。
プロパティーの名前はxmlandroid:keyで指定したものになります。

val preferences = PreferenceManager.getDefaultSharedPreferences(this)
val value = preferences?.getBoolean("notifications", false)

設定はチェックボックス以外にも文字入力・リストなど様々なものがあります。

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory android:title="設定1">
        <SwitchPreferenceCompat
            android:key="dark_mode"
            android:title="ダークモード"
            android:summary="ダークモードを有効にする"
            android:defaultValue="false" />

        <EditTextPreference
            android:key="username"
            android:title="ユーザー名"
            android:dialogTitle="ユーザー名を入力してください"
            android:summary="ユーザー名はアプリ内で表示されます"
            android:defaultValue="user123" />

        <ListPreference
            android:key="language"
            android:title="Language"
            android:summary="Select your preferred language"
            android:entries="@array/entries"
            android:entryValues="@array/values" />
    </PreferenceCategory>
</PreferenceScreen>

ListPreferenceで使う配列はres/arrays.xmlなどで下のように定義する必要があります。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="entries">
        <item>entry 1</item>
        <item>entry 2</item>
        <item>entry 3</item>
    </string-array>
    <string-array name="values">
        <item>0</item>
        <item>1</item>
        <item>1</item>
    </string-array>
</resources>

リストは下のようにアラート上で選択します。