💻

【備忘録】Preferenceを用いたデータの保存・読み込みについて

2023/07/14に公開

備忘録③Preferenceを用いたデータの保存・読み込み

前回に引き続き、Todoアプリで使ったPreferenceについて備忘録を残します。

もしよろしければ、アプリの感想やご意見も頂ければ幸いです。
https://play.google.com/store/apps/details?id=jp.dev.myapp.todo

Preferenceとは

Preferenceとは、ユーザーの設定や状態を保存するためのデータストレージです。
Preferenceは、キー(Key)と値(Value)のペアでデータを保存します。
アプリケーション全体で利用可能な共有プリファレンス(SharedPreference)と、アクティビティやフラグメントごとのプライベートプリファレンス(Preference)の2つのタイプがあります。

共有プリファレンスの保存と読み込み

共有プリファレンスを使用すると、アプリケーション全体でデータを共有できます。

// Preferenceの保存
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
val editor = sharedPreferences.edit()
editor.putString("username", "John")
editor.putInt("age", 25)
editor.putBoolean("isLogged", true)
editor.apply()

// Preferenceの読み込み
val savedUsername = sharedPreferences.getString("username", "")
val savedAge = sharedPreferences.getInt("age", 0)
val isLogged = sharedPreferences.getBoolean("isLogged", false)

この例では、PreferenceManager.getDefaultSharedPreferences(context)を使用してデフォルトの共有プリファレンスを取得しています。getDefaultSharedPreferences()メソッドは、デフォルトの共有プリファレンスファイルを作成し、そのファイルを操作するためのSharedPreferencesインスタンスを返します。
Preferenceの保存には、SharedPreferences.Editorを使用します。キーと値のペアを指定し、apply()メソッドで変更を確定させます。
保存したデータを読み込むには、同じキーを使用して値を取得します。getString()メソッドやgetInt()メソッドを使用し、キーに対応する値を取得します。また、値が存在しない場合のデフォルト値を指定することもできます。

プライベートプリファレンスの保存と読み込み

プライベートプリファレンスは、特定のアクティビティやフラグメント内でのみデータを共有します。プライベートプリファレンスを使用するには、PreferenceFragmentCompatを使用します。
以下はPreferenceFragmentCompatを使用したプライベートプリファレンスの保存および読み込む方法の例です。

  1. PreferenceFragmentCompatの作成
    PreferenceFragmentCompatを継承したクラスを作成します。このクラスでは、Preference画面の設定項目を定義します。
class MyPreferenceFragment : PreferenceFragmentCompat() {
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        preferenceManager.sharedPreferencesName = "MyPrefs" // プリファレンスファイルの名前を指定
        setPreferencesFromResource(R.xml.preferences, rootKey)
    }
}
  1. プリファレンス画面の設定項目の定義
    res/xml フォルダに preferences.xml という名前のファイルを作成し、Preference画面の設定項目を定義します。
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <EditTextPreference
        android:key="username"
        android:title="Username"
        android:summary="Enter your username" />
    <ListPreference
        android:key="theme"
        android:title="Theme"
        android:summary="Choose your app theme"
        android:entries="@array/theme_options"
        android:entryValues="@array/theme_values" />
</PreferenceScreen>
  1. PreferenceFragmentCompatの使用
    PreferenceFragmentCompatを使用するために、Activity内のFragmentManagerにFragmentを追加します。
class SettingsActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        supportFragmentManager.beginTransaction()
            .replace(android.R.id.content, MyPreferenceFragment())
            .commit()
    }
}
  1. Preferenceの保存と読み込み
    PreferenceFragmentCompat内で定義した設定項目は、プライベートプリファレンスに保存されます。保存したデータを読み込むには、以下のようにPreferenceManagerからPreferenceを取得します。
val sharedPreferences = preferenceManager.sharedPreferences
val savedUsername = sharedPreferences.getString("username", "")
val savedTheme = sharedPreferences.getString("theme", "")

このようにして、PreferenceFragmentCompatを使用してPreference画面を作成し、プライベートプリファレンスの保存と読み込みを行うことができます。

Preferenceのデータ型と設定項目

Preferenceには、様々なデータ型と設定項目が用意されています。
使えるデータ型は下記になります。

  • boolean型
  • float型
  • int型
  • long型
  • String型

設定項目は、下記の項目から適切な設定項目を選択します。

Preferenceの要素 表示内容
SwitchPreferenceCompat ON/OFF の設定(スイッチ)
CheckBoxPreference ON/OFF の設定(チェックボックス)
ListPreference リストで選択項目を表示
DropDownPreference ドロップダウンで選択項目を表示(ListPreference の拡張)
EditTextPreference テキスト入力のダイアログを表示
PreferenceCategory 設定項目をグルーピングして title を表示

Preferenceの変更監視とリスナー

ユーザーがPreferenceの値を変更したときに通知を受け取るためには、Preference.OnPreferenceChangeListenerを実装します。
リスナーを登録すると、ユーザーがPreferenceの値を変更した際にコールバックが呼び出されます。変更された値を取得し、必要な処理を実行することができます。
以下は、Preference.OnPreferenceChangeListenerを使用した例文です。

class MyPreferenceFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener {
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        preferenceManager.sharedPreferencesName = "MyPrefs"
        setPreferencesFromResource(R.xml.preferences, rootKey)

        val usernamePreference = findPreference<EditTextPreference>("username")
        usernamePreference?.onPreferenceChangeListener = this
    }

    override fun onPreferenceChange(preference: Preference?, newValue: Any?): Boolean {
        when (preference?.key) {
            "username" -> {
                val newUsername = newValue as? String
                // 新しいユーザー名の処理
                Log.d("TAG", "New Username: $newUsername")
            }
        }
        return true
    }
}

この例では、PreferenceFragmentCompatを使用してプライベートプリファレンスを保存および読み込むだけでなく、Preferenceの値が変更されたときに通知を受け取るためにPreference.OnPreferenceChangeListenerを実装しています。
Preferenceの変更を監視するために、onCreatePreferences()メソッド内でEditTextPreferenceのオンチェンジリスナーを設定しています。変更があった場合、onPreferenceChange()メソッドが呼び出されます。
onPreferenceChange()メソッドでは、変更があったPreferenceのキーを取得し、対応する処理を行います。この例では、"username"というキーに対して新しいユーザー名を取得してログに表示しています。
Preference.OnPreferenceChangeListenerを使用することで、ユーザーがPreferenceの値を変更した際にコールバックを受け取ることができます。これにより、変更された値を取得し、必要な処理を実行することができます。

まとめ

Androidアプリケーション開発において、Preferenceを使用してデータを保存・読み込みすることは重要な要素です。Preferenceを適切に活用することで、ユーザーの設定やデータの管理を効率的に行い、快適なユーザーエクスペリエンスを提供することができます。

参考

https://qiita.com/mackiso/items/7b0b0060b0489b62b4cb
https://maku77.github.io/android/fw/preference-fw.html
https://developer.android.com/reference/android/content/SharedPreferences.html
https://developer.android.com/guide/topics/ui/settings/customize-your-settings?hl=ja

Discussion