79 votes

Comment itérer à travers toutes les clés des préférences partagées ?

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

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

retourne 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 ?

177voto

Prabuddha Points 37089

Ce que vous pouvez faire, c'est utiliser getAll() méthode de SharedPreferences et obtenir toutes les valeurs dans Map<String,?> et ensuite vous pouvez facilement itérer à travers.

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 consulter PrefUtil.java's dump() mise en œuvre.

3 votes

Je n'obtiens aucune valeur :(

3 votes

getAll() peut retourner NULL valeur. Il serait préférable de vérifier keys pour NULL.

3 votes

C'est mieux d'utiliser entry.getValue() plutôt que entry.getValue().toString() pour ne pas obtenir de NullPointerException)

8voto

rmanna Points 632

Je pense que la question a plus à voir avec le pourquoi.

    PreferenceManager.getDefaultSharedPreferences(this).getAll()

renvoie une carte vide/contradictoire qu'avec la façon d'itérer sur une carte standard en Java. Document Android n'est pas très clair sur ce qui se passe ici, mais en gros, il semble que le tout 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 en cache de vos préférences qui fait que les modifications futures de votre fichier de préférences xml sont traitées de manière incohérente, c'est-à-dire qu'elles provoquent le décalage que vous avez 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);

0 votes

la solution dont j'avais besoin était une combinaison de cette réponse et de stackoverflow.com/a/9310697/1815624

4voto

anoo_radha Points 300

au cas où quelqu'un voudrait itérer à travers 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()             
 }

0voto

Webserveis Points 1102

En Kotlin, c'est très facile, vous pouvez changer FILE_PREF_XML pour votre fichier de préférences.

getSharedPreferences("FILE_PREF_XML", Context.MODE_PRIVATE).all?.forEach {
    Log.d(TAG,"shared pref(" + it.key + ") = " + it.value)
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X