2012-02-16 14 views
62

SharedPreferencesは、メソッドのgetAllを持っているが、それは一部のキーが存在するという事実にもかかわらず、何のエントリを返しません:共有プリファレンスのすべてのキーを反復処理する方法は?

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

戻り空のマップ

何が問題である真

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

戻りますか?すべての共有設定のリストを取得するには?

答えて

156

できることは、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'sdump()実装を確認することができます。

+3

これは私にとって何の値を返すされていない:( – astuter

+3

'のgetAll() 'は' NULL'値を返すことができます。NULLのために 'keys'をチェックする方が良いでしょう – trante

+2

' 'entry.getValue()。toString()' 'ではなく' 'entry.getValue()' ' get NullPointerException) –

7

は、私は質問が

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); 
+0

私が必要とする解決策は、この回答とhttp://stackoverflow.com/a/9310697/1815624の組み合わせです – CrandellWS

関連する問題