web-dev-qa-db-ja.com

共有設定のすべてのキーを反復処理する方法は?

SharedPreferencesにはgetAllメソッドがありますが、いくつかのキーが存在するにもかかわらずエントリを返しません。

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

trueを返します

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

空のマップを返します

なにが問題ですか?すべての共有設定のリストを取得する方法は?

76
Eugene Chumak

できることは、 getAll()SharedPreferencesのメソッドを使用し、_Map<String,?>_のすべての値を取得すれば、簡単に反復処理できます。

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

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

詳細については、 _PrefUtil.Java's_dump()実装を確認してください。

174
Lalit Poptani

私は質問が理由ともっと関係があると思う

    PreferenceManager.getDefaultSharedPreferences(this).getAll()

標準のJavaマップを繰り返し処理する方法よりも、空のマップまたは矛盾したマップを返します。 Android doc は、ここで何が起こっているのかについて明確ではありません。しかし基本的には、最初の呼び出しのようです

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

-これは、アプリを起動するときに設定を初期化するために呼び出すものです-ある種のキャッシュされた設定を作成します。これにより、xml設定ファイルへの将来の変更が一貫性なく処理されます。あなたの質問に記載されています。

この「キャッシュされたエンティティ」をリセットするには、次の手順を実行します(上記のリンクから思いつくことができます)。

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

誰もがKOTLINの共有設定を反復したい場合に備えて

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