【備忘録】Preferenceを用いたデータの保存・読み込みについて
備忘録③Preferenceを用いたデータの保存・読み込み
前回に引き続き、Todoアプリで使ったPreferenceについて備忘録を残します。
もしよろしければ、アプリの感想やご意見も頂ければ幸いです。
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を使用したプライベートプリファレンスの保存および読み込む方法の例です。
- PreferenceFragmentCompatの作成
PreferenceFragmentCompatを継承したクラスを作成します。このクラスでは、Preference画面の設定項目を定義します。
class MyPreferenceFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
preferenceManager.sharedPreferencesName = "MyPrefs" // プリファレンスファイルの名前を指定
setPreferencesFromResource(R.xml.preferences, rootKey)
}
}
- プリファレンス画面の設定項目の定義
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>
- 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()
}
}
- 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