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.