Użyj zapisanych wartości preferencji Zawiera Android Jetpack.

W tym dokumencie opisujemy, jak przechowywać i wykorzystywać Preference wartości zapisane przez do biblioteki preferencji.

Przechowywanie danych preferencji

Ta sekcja zawiera informacje o tym, jak Preference może przechowywać dane.

Ustawienia wspólne

Domyślnie Preference używa SharedPreferences do zapisania . Interfejs API SharedPreferences obsługuje proste odczytywanie i zapisywanie par klucz-wartość z pliku zapisywanego dla wszystkich sesji aplikacji. Biblioteka preferencji używa prywatnej instancji SharedPreferences, więc tylko nie może uzyskać do niego dostępu.

Załóżmy na przykład, że: SwitchPreferenceCompat:

<SwitchPreferenceCompat
        app:key="notifications"
        app:title="Enable message notifications"/>

Gdy użytkownik włączy przełącznik. stan, plik SharedPreferences aktualizacji za pomocą pary klucz-wartość "notifications" : "true". Używany klucz to taki sam jak klucz ustawiony w kluczu Preference.

Więcej informacji o interfejsie API SharedPreferences znajdziesz w artykule Zapisywanie pary klucz-wartość .

Informacje na temat różnych sposobów przechowywania danych na urządzeniu z Androidem znajdziesz w sekcji Dane i przechowywania plików.

Magazyn danych preferencji

Chociaż biblioteka preferencji przechowuje dane z elementami SharedPreferences przez Domyślnie SharedPreferences nie zawsze jest idealnym rozwiązaniem. Na przykład, jeśli aplikacja wymaga zalogowania się przez użytkownika, warto jednak ustawień aplikacji w chmurze, aby te ustawienia były odzwierciedlane we wszystkich usługach na innych urządzeniach i platformach. Jeśli aplikacja ma konfigurację specyficznych dla danego urządzenia, każdy użytkownik ma osobne ustawienia, co sprawia, że SharedPreferences nie jest idealnym rozwiązaniem.

PreferenceDataStore umożliwia używanie niestandardowego backendu pamięci masowej do utrwalania wartości Preference. Więcej informacje zawiera artykuł na temat używania niestandardowego magazynu danych.

Odczytywanie wartości preferencji

Aby pobrać używany obiekt SharedPreferences, wywołaj PreferenceManager.getDefaultSharedPreferences() Chociaż ta metoda działa z dowolnego miejsca w aplikacji, zalecamy podzielisz aplikację na warstwy. Więcej informacji można znaleźć w sekcji Dane warstwy danych.

Na przykład dla EditTextPreference z kluczem "signature", jak następujące:

<EditTextPreference
        app:key="signature"
        app:title="Your signature"/>

Zapisaną wartość parametru Preference możesz pobrać globalnie w ten sposób:

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", "");

Wykrywaj zmiany wartości preferencji

Aby wykryć zmiany wartości parametru Preference, możesz wybrać jedną z 2 opcji interfejsy:

W poniższej tabeli przedstawiono różnice między tymi dwoma interfejsami:

OnPreferenceChangeListener OnSharedPreferenceChangeListener
Ustawione na pojedynczym elemencie Preference. Ma zastosowanie do wszystkich obiektów Preference.
Wywoływane, gdy Preference ma zamiar zmienić zapisaną wartość. , nawet jeśli wartość oczekująca jest taka sama jak zapisana. Wywoływane tylko wtedy, gdy zmieni się wartość zapisana dla Preference.
Wywoływane tylko z biblioteki Preference. W osobnej części aplikacji mogą zmienić zapisaną wartość. Wywoływane za każdym razem, gdy zapisana wartość ulegnie zmianie, nawet jeśli pochodzi z osobnego tej części aplikacji.
Wywoływane przed zapisaniem wartości oczekującej. Wywoływane po zapisaniu wartości.
Wywołane przy użyciu: SharedPreferences lub PreferenceDataStore Dzwonione tylko przy użyciu funkcji SharedPreferences.

Implementacja OnPreferenceChangeListener

Implementacja OnPreferenceChangeListener umożliwia nasłuchiwanie oczekujących zmiana na wartość Preference. Następnie możesz sprawdzić, czy zmiana ma miejsce. Na przykład ten kod pokazuje, jak nasłuchiwać zmian w wartości EditTextPreference z kluczem "name":

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;
}

Następnie musisz ustawić tego detektora bezpośrednio za pomocą setOnPreferenceChangeListener() w następujący sposób:

Kotlin

preference.onPreferenceChangeListener = ...

Java

preference.setOnPreferenceChangeListener(...);

Implementowanie obiektu OnSharedPreferenceChangeListener

Jeśli zachowujesz wartości Preference za pomocą SharedPreferences, możesz też użyć funkcji SharedPreferences.OnSharedPreferenceChangeListener, aby nasłuchiwać zmian. Dzięki temu możesz nasłuchiwać, gdy wartości zapisane przez Preference ulegną zmianie, np. podczas synchronizowania ustawień z serwerem. Ten przykład pokazuje, jak nasłuchuj zmiany wartości EditTextPreference z kluczem "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, ""));
    }
}

Rejestrowanie detektora za pomocą registerOnSharedPreferenceChangedListener() w następujący sposób:

Kotlin

preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(...)

Java

getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(...);

Kotlin

    val listener: SharedPreferences.OnSharedPreferenceChangeListener =
            SharedPreferences.OnSharedPreferenceChangeListener {...}
    

Java

    SharedPreferences.OnSharedPreferenceChangeListener listener =
            new SharedPreferences.OnSharedPreferenceChangeListener() {...}
    

Aby zapewnić prawidłowe zarządzanie cyklem życia produktów (Activity lub Fragment), zarejestruj się wyrejestruj ten detektor w wywołaniach zwrotnych onResume() i onPause(), jak pokazano w tym przykładzie:

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);
}

Użyj niestandardowego magazynu danych

Zalecamy zachowywanie obiektów Preference przy użyciu SharedPreferences, możesz też użyć niestandardowego magazynu danych. Niestandardowy magazyn danych może być przydatny, jeśli aplikacja utrzymuje wartości w bazie danych lub jeśli wartości są związane z urządzeniem, jak co widać w poniższych przykładach.

Wdróż magazyn danych

Aby wdrożyć niestandardowy magazyn danych, utwórz klasę, która rozszerza PreferenceDataStore Poniższy przykład pokazuje magazyn danych, który obsługuje String wartości:

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.
    }
}

uruchamiać czasochłonne operacje poza wątkiem głównym, aby nie blokować użytkownika; za pomocą prostego interfejsu online. Możliwe, że w parametrze Fragment lub Activity zawierającym magazyn danych do zniszczenia przy zachowaniu wartości, zserializuj dane w taki sposób, nie utracą żadnych wartości zmienionych przez użytkownika.

Włącz magazyn danych

Po zaimplementowaniu magazynu danych ustaw nowy magazyn w onCreatePreferences(), aby Preference obiekty utrzymywały wartości z argumentem w bazie danych zamiast domyślnego magazynu danych SharedPreferences. Możesz włączyć dla każdego magazynu danych Preference lub całej hierarchii.

Aby włączyć niestandardowy magazyn danych dla określonego magazynu danych Preference, wywołaj setPreferenceDataStore(). Preference, jak w tym przykładzie:

Kotlin

val preference: Preference? = findPreference("key")
preference?.preferenceDataStore = dataStore

Java

Preference preference = findPreference("key");
if (preference != null) {
    preference.setPreferenceDataStore(dataStore);
}

Aby włączyć niestandardowy magazyn danych dla całej hierarchii, wywołaj setPreferenceDataStore() (PreferenceManager):

Kotlin

val preferenceManager = preferenceManager
preferenceManager.preferenceDataStore = dataStore

Java

PreferenceManager preferenceManager = getPreferenceManager();
preferenceManager.setPreferenceDataStore(dataStore);

Magazyn danych ustawiony dla konkretnego Preference zastępuje każdy magazyn danych, który dla odpowiedniej hierarchii. W większości przypadków magazyn danych ustawia się dla całą hierarchię.