Cómo usar valores de Preference guardados Parte de Android Jetpack.
En este documento, se describe cómo almacenar y usar
valores Preference
guardados por
la Biblioteca de Preference.
Almacenamiento de datos de Preference
En esta sección, se describe cómo un objeto Preference
puede persistir datos.
SharedPreferences
De forma predeterminada, un objeto Preference
usa
SharedPreferences
para guardar
de salida. La API de SharedPreferences
admite operaciones de lectura y escritura
pares clave-valor de un archivo que se guarda en las sesiones de la aplicación. El
La biblioteca de Preference usa una instancia de SharedPreferences
privada para que solo tu
aplicación puede acceder a ellos.
A modo de ejemplo, supongamos el siguiente objeto SwitchPreferenceCompat
:
<SwitchPreferenceCompat app:key="notifications" app:title="Enable message notifications"/>
Cuando un usuario activa esta opción. estado, el archivo SharedPreferences
se actualiza con un par clave-valor de "notifications" : "true"
. La clave que se usa es la
que la clave establecida para Preference
.
Para obtener más información sobre la API de SharedPreferences
, consulta Cómo guardar pares clave-valor.
datos.
Para obtener información sobre las diferentes maneras de almacenar datos en Android, consulta Datos y almacenamiento de archivos.
PreferenceDataStore
Aunque la biblioteca de Preference conserva datos con SharedPreferences
predeterminada, SharedPreferences
no siempre son una solución ideal. Por ejemplo,
tu aplicación requiere que un usuario acceda, tal vez quieras conservar
la configuración de la aplicación en la nube para que la configuración se refleje en
con otros dispositivos y plataformas. Del mismo modo, si tu aplicación tiene configuración
que son específicas del dispositivo, cada usuario tiene su propia configuración,
lo que convierte a SharedPreferences
en una solución poco ideal.
Un objeto PreferenceDataStore
te permite usar un backend de almacenamiento personalizado para conservar los valores de Preference
. Para ver más
consulta Usa un almacén de datos personalizado.
Cómo leer valores de Preference
Para recuperar el objeto SharedPreferences
que se usa, llama a PreferenceManager.getDefaultSharedPreferences()
.
Aunque este método funciona desde cualquier parte de tu aplicación, te recomendamos lo siguiente:
divides tu aplicación en capas. Para obtener más información, consulta Datos
capa.
Por ejemplo, con un objeto EditTextPreference
con una clave de "signature"
, como
sigue:
<EditTextPreference app:key="signature" app:title="Your signature"/>
Puedes recuperar el valor guardado de este Preference
de manera global de la siguiente manera:
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", "");
Cómo detectar los cambios en los valores de Preference
Para detectar cambios en los valores de Preference
, puedes elegir entre dos interfaces:
La siguiente tabla muestra las diferencias entre ambas interfaces:
OnPreferenceChangeListener |
OnSharedPreferenceChangeListener |
---|---|
Se establece en un solo Preference . |
Se aplica a todos los objetos Preference . |
Se llama cuando un Preference está a punto de cambiar su valor guardado.
incluso si el valor pendiente es el mismo que el guardado. |
Se llama solo cuando cambia el valor guardado para un Preference . |
Solo se llama a través de la biblioteca Preference . Una parte separada
de la aplicación puede cambiar el valor guardado. |
Se llama cada vez que cambia el valor guardado, incluso si es de una instancia parte de la aplicación. |
Se llama antes de que se guarde el valor pendiente. | Se llama después de que se guarda el valor. |
Se llama cuando se usa SharedPreferences o un
PreferenceDataStore |
Se llama solamente al usar SharedPreferences . |
Cómo implementar OnPreferenceChangeListener
Implementar un OnPreferenceChangeListener
te permite escuchar un mensaje
cambia al valor de un Preference
. Luego, puedes validar si el cambio
de que ocurra. Por ejemplo, el siguiente código muestra cómo detectar un cambio en la
Valor de un EditTextPreference
con una clave de "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; }
A continuación, debes configurar este objeto de escucha directamente con
setOnPreferenceChangeListener()
:
de la siguiente manera:
Kotlin
preference.onPreferenceChangeListener = ...
Java
preference.setOnPreferenceChangeListener(...);
Cómo implementar OnSharedPreferenceChangeListener
Al crear valores de Preference
persistentes con SharedPreferences
, también puedes usar un objeto SharedPreferences.OnSharedPreferenceChangeListener
para detectar cambios.
De esta manera, puedes detectar cuándo se modifican los valores guardados por Preference
.
como cuando se sincroniza
la configuración con un servidor. En el siguiente ejemplo, se muestra cómo
detecta un cambio en el valor de un EditTextPreference
con una clave de
"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 el objeto de escucha con
registerOnSharedPreferenceChangedListener()
:
de la siguiente manera:
Kotlin
preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(...)
Java
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(...);
Kotlin
val listener: SharedPreferences.OnSharedPreferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener {...}
Java
SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {...}
Para una administración adecuada del ciclo de vida en tu Activity
o Fragment
, registra y
cancela el registro de este objeto de escucha en las devoluciones de llamada onResume()
y onPause()
, como se muestra
en el siguiente ejemplo:
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); }
Usa un almacén de datos personalizado
Aunque recomendamos objetos Preference
persistentes con SharedPreferences
,
también puedes usar un almacén de datos personalizado. Un almacén de datos personalizado puede ser útil si tu
aplicación conserva los valores en una base de datos o si los valores son específicos del dispositivo, como
se muestran en los siguientes ejemplos.
Implementa el almacén de datos
Para implementar un almacén de datos personalizado, crea una clase que extienda
PreferenceDataStore
En el siguiente ejemplo, se crea un almacén de datos que controla
Valores 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. } }
Ejecutar cualquier operación que requiera mucho tiempo fuera del subproceso principal para evitar bloquear al usuario
interfaz de usuario. Como es posible que Fragment
o Activity
contenga el
que se destruya mientras se conserva un valor, serializa los datos para
y no pierdas ningún valor que haya modificado el usuario.
Habilita el almacén de datos
Después de implementar el almacén de datos, configura el nuevo almacén de datos en
onCreatePreferences()
para que los objetos Preference
conserven valores con el
en lugar de usar el SharedPreferences
predeterminado. Puedes habilitar un
almacén de datos para cada Preference
o para toda la jerarquía.
Para habilitar un almacén de datos personalizado para un Preference
específico, llama a
setPreferenceDataStore()
en Preference
, como se muestra en el siguiente ejemplo:
Kotlin
val preference: Preference? = findPreference("key") preference?.preferenceDataStore = dataStore
Java
Preference preference = findPreference("key"); if (preference != null) { preference.setPreferenceDataStore(dataStore); }
Para habilitar un almacén de datos personalizado para toda una jerarquía, llama a
setPreferenceDataStore()
en PreferenceManager
:
Kotlin
val preferenceManager = preferenceManager preferenceManager.preferenceDataStore = dataStore
Java
PreferenceManager preferenceManager = getPreferenceManager(); preferenceManager.setPreferenceDataStore(dataStore);
Un almacén de datos configurado para una Preference
específica anula cualquier almacén de datos que
se configura para la jerarquía correspondiente. En la mayoría de los casos, se configura un almacén de datos para
toda la jerarquía.