Utilizza i valori delle preferenze salvati Parte di Android Jetpack.
Questo documento descrive come archiviare e utilizzare
Valori di Preference
salvati da
nella libreria delle preferenze.
Archiviazione dati preferita
Questa sezione descrive in che modo un elemento Preference
può rendere persistenti i dati.
Preferenze condivise
Per impostazione predefinita, un Preference
utilizza
SharedPreferences
per risparmiare
e i relativi valori. L'API SharedPreferences
supporta lettura e scrittura semplici
coppie chiave-valore da un file salvato tra le sessioni dell'applicazione. La
La libreria delle preferenze utilizza un'istanza SharedPreferences
privata in modo che solo
l'applicazione possa accedervi.
Ad esempio, supponiamo che:
SwitchPreferenceCompat
:
<SwitchPreferenceCompat app:key="notifications" app:title="Enable message notifications"/>
Quando un utente attiva questa opzione lo stato corrente, il file SharedPreferences
si aggiorna con una coppia chiave-valore di "notifications" : "true"
. La chiave utilizzata è
uguale alla chiave impostata per Preference
.
Per ulteriori informazioni sull'API SharedPreferences
, consulta la sezione Salva coppia chiave-valore
di archiviazione dati.
Per informazioni sulle diverse modalità di archiviazione dei dati su Android, consulta l'articolo Informazioni e archiviazione di file.
Archivio dati Preference
Anche se la libreria delle preferenze mantiene i dati con SharedPreferences
del
per impostazione predefinita, SharedPreferences
non sono sempre una soluzione ideale. Ad esempio, se
se la tua applicazione richiede l'accesso da parte dell'utente, potresti voler mantenere
impostazioni dell'applicazione nel cloud in modo che si riflettano su
altri dispositivi e piattaforme. Allo stesso modo, se la tua applicazione ha
opzioni specifiche per ciascun dispositivo, ogni utente sul dispositivo ha impostazioni separate,
rendendo SharedPreferences
una soluzione non ottimale.
Un PreferenceDataStore
consente di utilizzare un backend di archiviazione personalizzato per rendere persistenti i valori Preference
. Per ulteriori informazioni
consulta Utilizzare un datastore personalizzato.
Lettura dei valori delle preferenze
Per recuperare l'oggetto SharedPreferences
in uso, chiama
PreferenceManager.getDefaultSharedPreferences()
Sebbene questo metodo funzioni da qualsiasi punto dell'applicazione, ti consigliamo di
suddividi la tua app in livelli. Per ulteriori informazioni, consulta la sezione Dati
.
Ad esempio, dato un valore EditTextPreference
con chiave "signature"
, come
che segue:
<EditTextPreference app:key="signature" app:title="Your signature"/>
Puoi recuperare il valore salvato per Preference
a livello globale, come segue:
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", "");
Monitora le modifiche ai valori delle preferenze
Per rilevare le modifiche ai valori di Preference
, puoi scegliere tra due
interfacce:
La tabella seguente mostra le differenze tra le due interfacce:
OnPreferenceChangeListener |
OnSharedPreferenceChangeListener |
---|---|
Impostato su un singolo Preference . |
Si applica a tutti gli oggetti Preference . |
Richiamato quando Preference sta per modificare il valore salvato,
anche se il valore in sospeso è uguale a quello salvato. |
Richiamato solo quando cambia il valore salvato di Preference . |
Chiamata solo tramite la raccolta di Preference . Una parte separata
dell'applicazione può modificare il valore salvato. |
Richiamato ogni volta che il valore salvato cambia, anche se proviene da un dell'applicazione. |
Richiamato prima del salvataggio del valore in attesa. | Richiamato dopo il salvataggio del valore. |
Hai chiamato con SharedPreferences o una
PreferenceDataStore . |
Chiamata soltanto con l'utilizzo di SharedPreferences . |
Implementare OnPreferenceChangeListener
L'implementazione di un OnPreferenceChangeListener
consente di rimanere in ascolto di un messaggio in attesa
cambia nel valore di Preference
. Poi puoi verificare se la modifica
. Ad esempio, il seguente codice mostra come ascoltare una modifica al metodo
valore di un EditTextPreference
con una chiave di "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; }
Poi devi impostare il listener direttamente con
setOnPreferenceChangeListener()
,
come segue:
Kotlin
preference.onPreferenceChangeListener = ...
Java
preference.setOnPreferenceChangeListener(...);
Implementazione di OnSharedPreferenceChangeListener
Quando mantieni valori Preference
utilizzando SharedPreferences
, puoi anche usare
un SharedPreferences.OnSharedPreferenceChangeListener
per ascoltare le modifiche.
In questo modo puoi rilevare quando vengono modificati i valori salvati da Preference
ad esempio per sincronizzare le impostazioni
con un server. L'esempio seguente mostra come
rimane in ascolto di una modifica al valore di un EditTextPreference
con una chiave
"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, "")); } }
Registra il listener utilizzando
registerOnSharedPreferenceChangedListener()
,
come segue:
Kotlin
preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(...)
Java
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(...);
Kotlin
val listener: SharedPreferences.OnSharedPreferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener {...}
Java
SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {...}
Per una corretta gestione del ciclo di vita in Activity
o Fragment
, registrati e
annulla la registrazione di questo listener nei callback onResume()
e onPause()
, come mostrato
nel seguente esempio:
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); }
Utilizza un datastore personalizzato
Anche se consigliamo di mantenere gli oggetti Preference
in modo permanente utilizzando SharedPreferences
,
puoi anche usare un datastore personalizzato. Un datastore personalizzato può essere utile se
l'applicazione rende persistenti i valori su un database o se i valori sono specifici di un dispositivo,
mostrate nei seguenti esempi.
Implementare il datastore
Per implementare un datastore personalizzato, crea una classe che si estende
PreferenceDataStore
. L'esempio seguente crea un datastore che gestisce
String
valori:
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. } }
Esegui operazioni dispendiose in termini di tempo dal thread principale per evitare di bloccare l'utente
a riga di comando. Poiché è possibile che Fragment
o Activity
contengano il parametro
l'eliminazione del datastore mantenendo un valore permanente, serializza i dati in modo da
di non perdere i valori modificati dall'utente.
Abilita il datastore
Dopo aver implementato il datastore, imposta il nuovo datastore
onCreatePreferences()
in modo che gli oggetti Preference
rimangano valori con
anziché utilizzare il datastore SharedPreferences
predefinito. Puoi attivare un
datastore per ogni Preference
o per l'intera gerarchia.
Per abilitare un datastore personalizzato per un valore Preference
specifico, chiama
setPreferenceDataStore()
su Preference
, come mostrato nell'esempio seguente:
Kotlin
val preference: Preference? = findPreference("key") preference?.preferenceDataStore = dataStore
Java
Preference preference = findPreference("key"); if (preference != null) { preference.setPreferenceDataStore(dataStore); }
Per abilitare un datastore personalizzato per un'intera gerarchia, chiama
setPreferenceDataStore()
il giorno PreferenceManager
:
Kotlin
val preferenceManager = preferenceManager preferenceManager.preferenceDataStore = dataStore
Java
PreferenceManager preferenceManager = getPreferenceManager(); preferenceManager.setPreferenceDataStore(dataStore);
Un datastore impostato per un Preference
specifico esegue l'override di qualsiasi datastore che
sia impostata per la gerarchia corrispondente. Nella maggior parte dei casi, imposti un datastore
dell'intera gerarchia.