Gespeicherte Einstellungswerte verwenden Teil von Android Jetpack
In diesem Dokument wird beschrieben, wie Sie
Preference
-Werte, die von
die Einstellungsbibliothek aus.
Bevorzugte Datenspeicherung
In diesem Abschnitt wird beschrieben, wie ein Preference
Daten dauerhaft speichern kann.
Gemeinsame Einstellungen
Standardmäßig verwendet ein Preference
Zum Speichern SharedPreferences
Werte. Die SharedPreferences
API unterstützt das Lesen und Schreiben einfacher
Schlüssel/Wert-Paare aus einer Datei, die über mehrere Anwendungssitzungen gespeichert wird. Die
Die Einstellungsbibliothek verwendet eine private SharedPreferences
-Instanz, sodass nur Ihre
App darauf zugreifen kann.
Angenommen,
SwitchPreferenceCompat
:
<SwitchPreferenceCompat app:key="notifications" app:title="Enable message notifications"/>
Wenn ein Nutzer diesen Schalter auf „Ein“ setzt wird die Datei SharedPreferences
mit dem Schlüssel/Wert-Paar "notifications" : "true"
aktualisiert. Der verwendete Schlüssel ist der
entspricht dem für Preference
festgelegten Schlüssel.
Weitere Informationen zur SharedPreferences
API finden Sie unter Schlüssel/Wert-Paar speichern
Daten.
Informationen über die verschiedenen Möglichkeiten zum Speichern von Daten auf Android finden Sie unter Daten und Dateispeicher.
Präferenzdatenspeicher
Obwohl die Präferenzbibliothek Daten mit SharedPreferences
speichert,
SharedPreferences
sind nicht immer eine ideale Lösung. Wenn beispielsweise
Ihre Anwendung erfordert, dass sich ein Nutzer anmeldet, sollten Sie
in der Cloud gespeichert, sodass diese für alle
anderen Geräten und Plattformen. Wenn Ihre Anwendung über Konfigurationseinstellungen verfügt,
Optionen, die gerätespezifisch sind, hat jeder Nutzer auf dem Gerät eigene Einstellungen,
Dadurch ist SharedPreferences
eine weniger gute Lösung.
PreferenceDataStore
können Sie ein benutzerdefiniertes Speicher-Back-End verwenden, um Preference
-Werte beizubehalten. Weitere Informationen
finden Sie unter Benutzerdefinierten Datenspeicher verwenden.
Werte von Leseeinstellungen
Rufen Sie zum Abrufen des verwendeten SharedPreferences
-Objekts den folgenden Befehl auf:
PreferenceManager.getDefaultSharedPreferences()
Obwohl diese Methode überall in Ihrer Anwendung funktioniert, empfehlen wir,
teilen Sie Ihre App in Ebenen auf. Weitere Informationen finden Sie unter Daten
Ebene
Beispiel: Bei einem EditTextPreference
mit dem Schlüssel "signature"
, wie
folgt:
<EditTextPreference app:key="signature" app:title="Your signature"/>
So können Sie den gespeicherten Wert für Preference
global abrufen:
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", "");
Auf Änderungen der Einstellungswerte warten
Sie können zwischen zwei Optionen wählen, um auf Änderungen an Preference
-Werten zu warten.
Schnittstellen:
Die folgende Tabelle zeigt, wie sich die beiden Oberflächen unterscheiden:
OnPreferenceChangeListener |
OnSharedPreferenceChangeListener |
---|---|
Festgelegt auf einem einzelnen Preference . |
Gilt für alle Preference -Objekte. |
Wird aufgerufen, wenn ein Preference im Begriff ist, seinen gespeicherten Wert zu ändern,
auch wenn der ausstehende Wert mit dem gespeicherten Wert übereinstimmt. |
Wird nur aufgerufen, wenn sich der für Preference gespeicherte Wert ändert. |
Wird nur über die Preference -Bibliothek aufgerufen. Ein separater Teil
der Anwendung den gespeicherten Wert ändern kann. |
Wird immer dann aufgerufen, wenn sich der gespeicherte Wert ändert, auch wenn er von einem separaten Teil der Anwendung. |
Wird aufgerufen, bevor der ausstehende Wert gespeichert wird. | Wird aufgerufen, nachdem der Wert gespeichert wurde. |
Wird bei Verwendung von SharedPreferences oder eines
PreferenceDataStore . |
Wird nur bei Verwendung von SharedPreferences aufgerufen. |
OnPreferenceChangeListener implementieren
Durch die Implementierung eines OnPreferenceChangeListener
können Sie auf einen ausstehenden
in den Wert einer Preference
ändern. Dann können Sie überprüfen, ob die Änderung
erfolgt. Der folgende Code zeigt beispielsweise, wie auf eine Änderung am
Wert einer EditTextPreference
mit dem Schlüssel "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; }
Als Nächstes legen Sie diesen Listener direkt mit
setOnPreferenceChangeListener()
,
wie folgt:
Kotlin
preference.onPreferenceChangeListener = ...
Java
preference.setOnPreferenceChangeListener(...);
OnSharedPreferenceChangeListener implementieren
Wenn Sie Preference
-Werte mit SharedPreferences
dauerhaft speichern, können Sie auch Folgendes verwenden:
SharedPreferences.OnSharedPreferenceChangeListener
, um auf Änderungen zu warten.
So können Sie darauf warten, dass sich die von Preference
gespeicherten Werte ändern.
z. B. wenn Einstellungen
mit einem Server synchronisiert werden. Das folgende Beispiel zeigt, wie Sie
Auf Änderung des Werts eines EditTextPreference
mit dem Schlüssel warten
"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, "")); } }
Registrieren Sie den Listener mithilfe von
registerOnSharedPreferenceChangedListener()
,
wie folgt:
Kotlin
preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(...)
Java
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(...);
Kotlin
val listener: SharedPreferences.OnSharedPreferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener {...}
Java
SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {...}
Für eine ordnungsgemäße Lebenszyklusverwaltung in Activity
oder Fragment
registrieren und
hebt die Registrierung dieses Listeners in den Callbacks onResume()
und onPause()
auf, wie hier gezeigt.
im folgenden Beispiel:
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); }
Benutzerdefinierten Datenspeicher verwenden
Obwohl wir empfehlen, Preference
-Objekte mit SharedPreferences
dauerhaft zu speichern,
können Sie auch einen
benutzerdefinierten Datenspeicher verwenden. Ein benutzerdefinierter Datenspeicher kann nützlich sein,
oder wenn Werte gerätespezifisch sind, wie z. B.
die in den folgenden Beispielen gezeigt werden.
Datenspeicher implementieren
Erstellen Sie zum Implementieren eines benutzerdefinierten Datenspeichers eine Klasse, die das
PreferenceDataStore
Im folgenden Beispiel wird ein Datenspeicher erstellt,
String
-Werte:
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. } }
Zeitaufwendige Vorgänge außerhalb des Hauptthreads ausführen, um den Nutzer nicht zu blockieren
. Da es möglich ist, dass Fragment
oder Activity
beim Speichern eines Werts gelöscht werden soll, serialisieren Sie die Daten,
gehen keine vom Nutzer geänderten Werte verloren.
Datenspeicher aktivieren
Nachdem Sie den Datenspeicher implementiert haben, legen Sie den neuen Datenspeicher in
onCreatePreferences()
, damit Preference
-Objekte Werte mit der Eigenschaft
Datenspeicher gespeichert, anstatt den Standard-SharedPreferences
zu verwenden. Sie können eine
Datenspeicher für jede Preference
oder für die gesamte Hierarchie.
Rufen Sie zum Aktivieren eines benutzerdefinierten Datenspeichers für eine bestimmte Preference
Folgendes auf:
setPreferenceDataStore()
zum Preference
, wie im folgenden Beispiel gezeigt:
Kotlin
val preference: Preference? = findPreference("key") preference?.preferenceDataStore = dataStore
Java
Preference preference = findPreference("key"); if (preference != null) { preference.setPreferenceDataStore(dataStore); }
Um einen benutzerdefinierten Datenspeicher für eine gesamte Hierarchie zu aktivieren, rufen Sie
setPreferenceDataStore()
am PreferenceManager
:
Kotlin
val preferenceManager = preferenceManager preferenceManager.preferenceDataStore = dataStore
Java
PreferenceManager preferenceManager = getPreferenceManager(); preferenceManager.setPreferenceDataStore(dataStore);
Ein Datenspeicher, der für eine bestimmte Preference
festgelegt ist, überschreibt alle Datenspeicher, die
für die entsprechende Hierarchie festgelegt ist. In den meisten Fällen legen Sie einen Datenspeicher für
der gesamten Hierarchie.