保存した設定値を使用する 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.
    }
}

時間のかかるオペレーションをメインスレッドの外部で実行して、ユーザーのブロックを回避する 行うことができます。FragmentActivity に 破棄する場合は、データをシリアル化して、 ユーザーが変更した値が失われることはありません

データストアを有効にする

データストアを実装したら、 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 に設定されたデータストアは、 対応する階層に対して設定されます。ほとんどの場合、データストアは 継承されます。