2012-02-16 88 views
62

SharedPreferences有方法GETALL,但儘管它沒有返回項中的某些項存在:如何迭代共享首選項的所有鍵?

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

返回true

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

返回空地圖

有什麼不對?如何獲得所有共享偏好的列表?

回答

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 2014-01-07 06:27:47

+3

'GETALL() ''可以返回NULL值,最好檢查'keys'爲NULL。 – trante 2014-04-26 19:36:43

+2

最好使用''entry.getValue()''而不是''entry.getValue()。toString()''不要得到NullPointerException) – 2016-04-12 03:01:55

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 2016-04-15 18:25:22