2011-08-31 33 views
17

Tôi có một đơn giản thiết lập số (không sử dụng có thể chỉnh sửa) được định nghĩa trong một sở thích XML như sau:SharedPreferences.getInt() kết quả trong ClassCastException - Tại sao?

<EditTextPreference 
    android:key="@string/numeric_val" 
    android:defaultValue="0" /> 

Và tôi đọc nó bằng tuyên bố đơn giản này:

sharedPrefs.getInt(getString(R.string.numeric_val), 3) 

Nó hoạt động, nhưng khi Tôi cố gắng đọc nó, lần đầu tiên sau khi cài đặt ứng dụng, nó tạo ra một ClassCastException.

documentation nói rằng getInt()"Ném ClassCastException nếu có tùy chọn với tên này không phải là int." - và tôi biết rằng tùy chọn này được xác định rõ ràng là <EditTextPreference> (một chuỗi?) Nhưng, nếu đây là lý do ngoại lệ, tôi phải sử dụng SharedPreferences.getInt() như thế nào?

Tôi biết tôi có thể sử dụng SharedPreferences.getString() để thay thế và sau đó tự phân tích cú pháp/chuyển đổi, nhưng sau đó mục đích của SharedPreferences.getInt() là gì?

Trả lời

28

Bạn có thể lưu trữ tùy chọn là sharedPreferences.edit().putInt(..).commit() (làm ví dụ);

Và sau đó nhận chúng như getInt. Nhưng nếu bạn sử dụng EditTextPreference nó sẽ thiết lập loại sở thích thành chuỗi. Vì vậy, nếu bạn sử dụng EditTextPreference để lưu trữ một số dữ liệu, hãy sử dụng Integer.valueOf(getString) để lấy lại dữ liệu.

Nếu bạn đặt nó theo cách thủ công, hãy sử dụng getInt().

Để giải quyết sự cố, bạn có thể đặt onPreferenceChangeListener trên EditTextPreference này và bất cứ khi nào người dùng thay đổi, bạn sẽ lưu thủ công dưới dạng int, vì vậy, getInt sẽ hoạt động bình thường.

+0

Cảm ơn bạn đã giải thích rất giáo dục này. +1 và chấp nhận. – uTubeFan

4
android:defaultValue="0" 

là một chuỗi.

Không có cách nào để khai báo một int thực tế trong xml của prefs của bạn

Các vấn đề liên quan