web-dev-qa-db-fra.com

Comment parcourir toutes les clés des préférences partagées?

SharedPreferences a la méthode getAll, mais elle ne renvoie aucune entrée malgré le fait que certaines clés existent:

PreferenceManager.getDefaultSharedPreferences(this).contains("addNewAddress");

renvoie vrai

Map<String, ?> keys=PreferenceManager.getDefaultSharedPreferences(this).getAll();

renvoie une carte vide

Qu'est-ce qui ne va pas? Comment obtenir la liste de toutes les préférences partagées?

76
Eugene Chumak

Ce que vous pouvez faire, c'est utiliser la méthode getAll() de SharedPreferences et obtenir toutes les valeurs dans Map<String,?>, Puis vous pouvez facilement les parcourir.

Map<String,?> keys = prefs.getAll();

for(Map.Entry<String,?> entry : keys.entrySet()){
            Log.d("map values",entry.getKey() + ": " + 
                                   entry.getValue().toString());            
 }

Pour en savoir plus, vous pouvez vérifier PrefUtil.Java'sdump() implémentation.

174
Lalit Poptani

je pense que la question a plus à voir avec pourquoi

    PreferenceManager.getDefaultSharedPreferences(this).getAll()

renvoie une carte vide/contradictoire par rapport à la façon d'itérer sur une carte standard Java. la doc Android n'est pas vraiment claire sur ce qui se passe ici, mais fondamentalement, elle semble être le premier appel à

    PreferenceManager.setDefaultValues(this, R.xml.preferences,false)

- qui est ce que vous êtes censé appeler pour initialiser les préférences lorsque vous démarrez votre application - crée une sorte de version mise en cache de vos préférences qui provoque des modifications futures de votre fichier de préférences xml de manière incohérente, c'est-à-dire, provoquant le décalage vous décrit dans votre question.

pour réinitialiser cette "entité en cache", suivez ces étapes (que vous pouvez en quelque sorte trouver à partir du lien ci-dessus):

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    prefs.edit().clear();
    PreferenceManager.setDefaultValues(this, R.xml.preferences, true);
8
rmanna

au cas où quelqu'un voudrait parcourir les préférences partagées dans KOTLIN

 sharedPreferences?.all?.forEach {
     //access key using it.key & value using it.value
     Log.d("Preferences values",it.key() + ": " + it.value()             
 }
3
anoo_radha