Làm thế nào để lặp lại tất cả các khóa của sở thích được chia sẻ?


79

SharedPreferences có phương thức getAll, nhưng nó không trả về mục nhập nào mặc dù thực tế có một số khóa tồn tại:

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

trả về true

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

trả lại bản đồ trống

Chuyện gì thế? Làm thế nào để có được danh sách tất cả các sở thích được chia sẻ?

Câu trả lời:


177

Những gì bạn có thể làm là sử dụng getAll()method of SharedPreferencesvà lấy tất cả các giá trị Map<String,?>và sau đó bạn có thể dễ dàng lặp lại.

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

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

Để biết thêm, bạn có thể kiểm tra việc thực hiện.PrefUtil.java's dump()


3
điều này không trả về giá trị nào cho tôi :(
uniruddh

3
getAll()có thể trả về NULLgiá trị. Sẽ tốt hơn nếu kiểm tra keysNULL.
trante

3
Tốt hơn là sử dụng entry.getValue()chứ không phải là entry.getValue().toString()không nhận được NullPointerException)
Vlad

8

tôi nghĩ câu hỏi liên quan nhiều hơn đến lý do tại sao

    PreferenceManager.getDefaultSharedPreferences(this).getAll()

đang trả về một bản đồ trống / mâu thuẫn với cách lặp qua bản đồ java tiêu chuẩn. các doc android là không thực sự tinh thể rõ ràng về những gì đang xảy ở đây nhưng về cơ bản nó có vẻ như các cuộc gọi đầu tiên để

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

- đó là những gì bạn phải gọi để khởi tạo tùy chọn khi bạn khởi động ứng dụng của mình - tạo một số loại phiên bản tùy chọn được lưu trong bộ nhớ cache khiến các thay đổi trong tương lai đối với tệp tùy chọn xml của bạn sẽ được xử lý không nhất quán, tức là khiến bạn không khớp được mô tả trong câu hỏi của bạn.

để đặt lại "thực thể được lưu trong bộ nhớ cache" này, hãy làm theo các bước sau (mà bạn có thể tìm ra từ liên kết trên):

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

giải pháp tôi cần là sự kết hợp của câu trả lời này và stackoverflow.com/a/9310697/1815624
CrandellWS

4

trong trường hợp bất kỳ ai muốn lặp lại qua các tham chiếu được chia sẻ trong KOTLIN

 sharedPreferences?.all?.forEach {
     //access key using it.key & value using it.value
     Log.d("Preferences values",it.key() + ": " + it.value()             
 }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.