Utiliser les valeurs de préférence enregistrées Inclus dans Android Jetpack.
Ce document explique comment stocker et utiliser
Les valeurs Preference
enregistrées par
la bibliothèque des préférences.
Stockage des données des préférences
Cette section décrit comment un Preference
peut conserver des données.
SharedPreferences
Par défaut, un Preference
utilise
SharedPreferences
pour économiser
valeurs. L'API SharedPreferences
permet de lire et d'écrire
à partir d'un fichier enregistré lors des sessions d'application. La
La bibliothèque de préférences utilise une instance SharedPreferences
privée afin que seules vos données
application peut y accéder.
Par exemple, supposons que
SwitchPreferenceCompat
:
<SwitchPreferenceCompat app:key="notifications" app:title="Enable message notifications"/>
Lorsqu'un utilisateur active cet interrupteur le fichier SharedPreferences
les mises à jour avec une paire clé-valeur "notifications" : "true"
. La clé utilisée est la
identique à celle définie pour Preference
.
Pour en savoir plus sur l'API SharedPreferences
, consultez la section Enregistrer une clé-valeur
données.
Pour en savoir plus sur les différentes manières de stocker des données sur Android, consultez la section Données et le stockage de fichiers.
PreferenceDataStore
Bien que la bibliothèque Preference conserve les données avec SharedPreferences
par défaut, les SharedPreferences
ne sont pas toujours une solution idéale. Par exemple, si
votre application nécessite qu'un utilisateur se connecte, vous pouvez conserver
les paramètres de l'application dans le cloud afin qu'ils soient répercutés
d'autres appareils
et plates-formes. De même, si votre application dispose d'une configuration
spécifiques à l'appareil, chaque utilisateur de l'appareil dispose de paramètres distincts,
ce qui fait de SharedPreferences
une solution qui n'est pas idéale.
Un PreferenceDataStore
vous permet d'utiliser un backend de stockage personnalisé pour conserver les valeurs Preference
. Pour plus
plus d'informations, consultez la section Utiliser un datastore personnalisé.
Lire les valeurs des préférences
Pour récupérer l'objet SharedPreferences
utilisé, appelez
PreferenceManager.getDefaultSharedPreferences()
Bien que cette méthode fonctionne partout dans votre application, nous vous recommandons
vous divisez votre application en couches. Pour en savoir plus, consultez la section Données
calque.
Par exemple, pour un EditTextPreference
dont la clé est "signature"
, comme
ce qui suit:
<EditTextPreference app:key="signature" app:title="Your signature"/>
Vous pouvez récupérer la valeur enregistrée pour ce Preference
de manière globale, comme suit:
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", "");
Écouter les modifications apportées aux valeurs des préférences
Pour écouter les modifications apportées aux valeurs Preference
, vous avez le choix entre deux
interfaces:
Le tableau suivant montre les différences entre les deux interfaces:
OnPreferenceChangeListener |
OnSharedPreferenceChangeListener |
---|---|
Défini sur un seul Preference . |
S'applique à tous les objets Preference . |
Appelé lorsqu'un Preference est sur le point de modifier sa valeur enregistrée
même si la valeur en attente est identique à la valeur enregistrée. |
Appelé uniquement lorsque la valeur enregistrée pour un Preference change. |
Appelé uniquement via la bibliothèque Preference . Une partie distincte
de l'application peut modifier la valeur enregistrée. |
Appelé chaque fois que la valeur enregistrée change, même si elle provient d'un de l'application. |
Appelée avant l'enregistrement de la valeur "en attente". | Appelé après l'enregistrement de la valeur. |
Appelé lors de l'utilisation de SharedPreferences ou d'un
PreferenceDataStore |
Appelé uniquement lors de l'utilisation de SharedPreferences . |
Implémenter OnPreferenceChangeListener
L'implémentation d'un OnPreferenceChangeListener
vous permet d'écouter un événement en attente
la valeur d'un Preference
. Vous pouvez ensuite vérifier si la modification
se produit. Par exemple, le code suivant montre comment écouter une modification apportée au
Valeur d'un EditTextPreference
avec une clé 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; }
Vous devez ensuite définir cet écouteur directement avec
setOnPreferenceChangeListener()
,
comme suit:
Kotlin
preference.onPreferenceChangeListener = ...
Java
preference.setOnPreferenceChangeListener(...);
Implémenter OnSharedPreferenceChangeListener
Lorsque vous conservez des valeurs Preference
à l'aide de SharedPreferences
, vous pouvez également utiliser
un SharedPreferences.OnSharedPreferenceChangeListener
pour écouter les modifications.
Cela vous permet d'écouter quand les valeurs enregistrées par votre Preference
sont modifiées.
par exemple lors de la synchronisation
des paramètres avec un serveur. L'exemple suivant montre comment
écouter une modification de la valeur d'un EditTextPreference
avec une clé 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, "")); } }
Enregistrez l'écouteur à l'aide de
registerOnSharedPreferenceChangedListener()
,
comme suit:
Kotlin
preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(...)
Java
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(...);
Kotlin
val listener: SharedPreferences.OnSharedPreferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener {...}
Java
SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {...}
Pour une gestion appropriée du cycle de vie dans Activity
ou Fragment
, enregistrez et
annuler l'enregistrement de cet écouteur dans les rappels onResume()
et onPause()
, comme indiqué ci-dessous ;
dans l'exemple suivant:
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); }
Utiliser un datastore personnalisé
Bien que nous recommandions de conserver les objets Preference
à l'aide de SharedPreferences
,
vous pouvez aussi utiliser
un datastore personnalisé. Un datastore personnalisé peut s'avérer utile
l'application conserve les valeurs dans une base de données ou si les valeurs sont spécifiques à un appareil,
comme indiqué dans les exemples suivants.
Implémenter le datastore
Pour implémenter un magasin de données personnalisé, créez une classe qui étend
PreferenceDataStore
L'exemple suivant crée un datastore qui gère
Valeurs 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. } }
Exécuter les opérations chronophages en dehors du thread principal pour éviter de bloquer l'utilisateur
de commande. Étant donné qu'il est possible que le Fragment
ou le Activity
contenant le
datastore à détruire en cas de persistance d'une valeur, sérialisez les données pour
ne perdez aucune valeur modifiée par l'utilisateur.
Activer le datastore
Après avoir implémenté votre datastore, définissez le nouveau datastore dans
onCreatePreferences()
afin que les objets Preference
conservent les valeurs avec
datastore au lieu d'utiliser la valeur par défaut SharedPreferences
. Vous pouvez activer
datastore pour chaque Preference
ou pour l'ensemble de la hiérarchie.
Pour activer un datastore personnalisé pour un Preference
spécifique, appelez
setPreferenceDataStore()
sur Preference
, comme illustré dans l'exemple suivant:
Kotlin
val preference: Preference? = findPreference("key") preference?.preferenceDataStore = dataStore
Java
Preference preference = findPreference("key"); if (preference != null) { preference.setPreferenceDataStore(dataStore); }
Pour activer un datastore personnalisé pour une hiérarchie entière, appelez
setPreferenceDataStore()
sur le PreferenceManager
:
Kotlin
val preferenceManager = preferenceManager preferenceManager.preferenceDataStore = dataStore
Java
PreferenceManager preferenceManager = getPreferenceManager(); preferenceManager.setPreferenceDataStore(dataStore);
Un datastore défini pour une Preference
spécifique remplace tout datastore qui
est défini pour la hiérarchie correspondante. Dans la plupart des cas, vous définissez un datastore
toute la hiérarchie.