保存した設定値を使用する Android Jetpack の一部。
このドキュメントでは、Terraform を使用して
によって保存される Preference
値
Preference ライブラリを使用します。
Preference のデータ保存
このセクションでは、Preference
でのデータの保持方法について説明します。
SharedPreferences
デフォルトでは、Preference
は以下を使用します。
SharedPreferences
で節約
使用できます。SharedPreferences
API は、シンプルな読み取りと書き込みをサポートします。
アプリケーション セッション間で保存されるファイルからの Key-Value ペア。「
Preference ライブラリはプライベート SharedPreferences
インスタンスを使用して、
アクセスできます。
たとえば、次のような SwitchPreferenceCompat
があるとします。
<SwitchPreferenceCompat app:key="notifications" app:title="Enable message notifications"/>
ユーザーがこのスイッチを「オン」に切り替えたとき状態(SharedPreferences
ファイル)
"notifications" : "true"
の Key-Value ペアで更新を行います。使用される鍵は、
Preference
に設定された鍵と同じもの。
SharedPreferences
API について詳しくは、Key-Value を保存する
提供します。
Android でデータを保存するさまざまな方法については、データ ファイル ストレージの概要をご覧ください。
PreferenceDataStore
Preference ライブラリは SharedPreferences
ただし、SharedPreferences
は必ずしも理想的なソリューションとは限りません。たとえば
アプリケーションでユーザーにログインを要求する場合は、永続化テーブルを
アプリケーション設定をクラウドに移行して、その設定がクラウド全体に反映
他のデバイスやプラットフォームで使用できます。同様に、アプリケーションに
デバイス固有のオプションがあり、デバイスの各ユーザーは個別の設定を持ち、
SharedPreferences
を理想的とは言えません。
PreferenceDataStore
を使用すると、カスタム ストレージ バックエンドを使用して Preference
値を保持できます。詳細
詳細については、カスタム データストアを使用するをご覧ください。
Preference 値の読み取り
使用中の SharedPreferences
オブジェクトを取得するには、PreferenceManager.getDefaultSharedPreferences()
を呼び出します。
この方法はアプリケーションのどこからでも機能しますが、
アプリをレイヤに分割します詳しくは、データ
レイヤです。
たとえば、キーが "signature"
の EditTextPreference
の場合、次のようになります。
次のようになります。
<EditTextPreference app:key="signature" app:title="Your signature"/>
この Preference
に保存された値は、次のようにグローバルに取得できます。
Kotlin
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this /* Activity context */) val name = sharedPreferences.getString("signature", "")
Java
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this /* Activity context */); String name = sharedPreferences.getString("signature", "");
Preference 値の変更をリッスンする
Preference
値の変更をリッスンするには、次の 2 つのインターフェースのいずれかを選択します。
次の表に、2 つのインターフェースの違いを示します。
OnPreferenceChangeListener |
OnSharedPreferenceChangeListener |
---|---|
1 つの Preference で設定されます。 |
すべての Preference オブジェクトに適用されます。 |
保存された値を Preference が変更しようとしたときに呼び出されます。
保留中の値と保存されている値が同じ場合にも保持されます。 |
Preference に保存された値が変更された場合にのみ呼び出されます。 |
Preference ライブラリを介してのみ呼び出されます。独立したパート
保存された値を変更できます。 |
保存された値が変更されるたびに呼び出されます(別の値からのものも含む) 使用されます。 |
保留中の値が保存される前に呼び出されます。 | 値が保存された後に呼び出されます。 |
SharedPreferences または
PreferenceDataStore 。 |
SharedPreferences を使用している場合にのみ呼び出されます。 |
OnPreferenceChangeListener を実装する
OnPreferenceChangeListener
を実装すると、保留中のキューをリッスンできます。
Preference
の値に変更します。その後、変更が変更が加えられたかどうかを
発生します。たとえば、次のコードは、変更をリッスンする方法を示しています。
キーが "name"
である EditTextPreference
の値は次のようになります。
Kotlin
override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean { Log.e("preference", "Pending Preference value is: $newValue") return true }
Java
@Override public boolean onPreferenceChange(Preference preference, Object newValue) { Log.e("preference", "Pending Preference value is: " + newValue); return true; }
次に、このリスナーを
setOnPreferenceChangeListener()
次のとおりです。
Kotlin
preference.onPreferenceChangeListener = ...
Java
preference.setOnPreferenceChangeListener(...);
OnSharedPreferenceChangeListener を実装する
SharedPreferences
を使用して Preference
値を保持している場合は、SharedPreferences.OnSharedPreferenceChangeListener
を使用して変更をリッスンすることもできます。
これにより、Preference
によって保存された値が変更されたときにリッスンできます。
サーバーと設定を同期する場合などです。次の例で、
次のキーで EditTextPreference
の値の変更をリッスンします。
"name"
:
Kotlin
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { if (key == "signature") { Log.i(TAG, "Preference value was updated to: " + sharedPreferences.getString(key, "")) } }
Java
@Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (key.equals("signature")) { Log.i(TAG, "Preference value was updated to: " + sharedPreferences.getString(key, "")); } }
次のコマンドを使用してリスナーを登録します。
registerOnSharedPreferenceChangedListener()
次のとおりです。
Kotlin
preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(...)
Java
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(...);
Kotlin
val listener: SharedPreferences.OnSharedPreferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener {...}
Java
SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {...}
Activity
または Fragment
でライフサイクルを適切に管理するには、登録して
次に示すように、onResume()
コールバックと onPause()
コールバックでこのリスナーの登録を解除します。
使用します。
Kotlin
override fun onResume() { super.onResume() preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(this) } override fun onPause() { super.onPause() preferenceManager.sharedPreferences.unregisterOnSharedPreferenceChangeListener(this) }
Java
@Override public void onResume() { super.onResume(); getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); } @Override public void onPause() { super.onPause(); getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); }
カスタム データストアを使用する
Preference
オブジェクトは SharedPreferences
を使用して永続化することをおすすめしますが、
カスタム データストアも使用できます。カスタム データストアは、
アプリケーションがデータベースに値を保持したり、値がデバイス固有の場合に
例を示しています。
データストアを実装する
カスタム データストアを実装するには、
PreferenceDataStore
。次の例では、1 対 1 または 2 の
String
値:
Kotlin
class DataStore : PreferenceDataStore() { override fun putString(key: String, value: String?) { // Save the value somewhere. } override fun getString(key: String, defValue: String?): String? { // Retrieve the value. } }
Java
public class DataStore extends PreferenceDataStore { @Override public void putString(String key, @Nullable String value) { // Save the value somewhere. } @Override @Nullable public String getString(String key, @Nullable String defValue) { // Retrieve the value. } }
時間のかかるオペレーションをメインスレッドの外部で実行して、ユーザーのブロックを回避する
行うことができます。Fragment
や Activity
に
破棄する場合は、データをシリアル化して、
ユーザーが変更した値が失われることはありません
データストアを有効にする
データストアを実装したら、
onCreatePreferences()
で、Preference
オブジェクトが
使用することをおすすめします。SharedPreferences
有効にすることで、
(Preference
ごと、または階層全体のデータストア)を作成します。
特定の Preference
でカスタム データストアを有効にするには、以下を呼び出します。
setPreferenceDataStore()
Preference
に追加します。
Kotlin
val preference: Preference? = findPreference("key") preference?.preferenceDataStore = dataStore
Java
Preference preference = findPreference("key"); if (preference != null) { preference.setPreferenceDataStore(dataStore); }
階層全体でカスタム データストアを有効にするには、
PreferenceManager
に対する setPreferenceDataStore()
:
Kotlin
val preferenceManager = preferenceManager preferenceManager.preferenceDataStore = dataStore
Java
PreferenceManager preferenceManager = getPreferenceManager(); preferenceManager.setPreferenceDataStore(dataStore);
特定の Preference
に設定されたデータストアは、
対応する階層に対して設定されます。ほとんどの場合、データストアは
継承されます。