2011-10-03 26 views
6

Tôi đang cố thêm danh sách vào ứng dụng của mình. mã XML của tôi là những điều sau đây:Android bị lỗi trên ListPreference

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
<PreferenceCategory android:title="@string/calendarsettings"> 
    <CheckBoxPreference android:key="syncWithCalendar" 
     android:title="@string/setting_calendarsync" android:summary="@string/setting_calendarsync"></CheckBoxPreference> 
    <CheckBoxPreference android:key="calendarAlarm" 
     android:title="@string/settings_calendaralarm" android:summary="@string/settings_calendaralarm"></CheckBoxPreference> 
</PreferenceCategory> 
<PreferenceCategory android:title="@string/filters"> 
    <ListPreference android:key="dayFilter" android:title="@string/dayfilter" 
     android:summary="@string/dayfilter" android:entries="@array/dayFilterArray" 
     android:entryValues="@array/dayFilterValues" /> 
</PreferenceCategory> 
</PreferenceScreen> 

Và giá trị mảng của tôi là:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<string-array name="dayFilterArray"> 
<item>a</item> 
<item>b</item> 
<item>c</item> 
<item>d</item> 
<item>e</item> 
<item>f</item> 
<item>g</item> 
</string-array> 
    <string-array name="dayFilterValues"> 
<item>0</item> 
<item>3</item> 
<item>7</item> 
<item>14</item> 
<item>30</item> 
<item>90</item> 
<item>365</item> 
    </string-array> 
</resources> 

Tuy nhiên khi tôi cố gắng để vào menu sở thích của tôi nó bị treo với ngoại lệ sau:

10-03 20:27:56.938: ERROR/AndroidRuntime(1111): Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String 

Trong đó đề cập đến dòng mã này:

addPreferencesFromResource(R.xml.preferences); 

Bất kỳ suy nghĩ nào về điều này và tại sao nó lại xảy ra? Cảm ơn.

ĐẦY ĐỦ Stack Trace:

10-03 21:13:06.828: ERROR/AndroidRuntime(3045): FATAL EXCEPTION: main 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045): java.lang.RuntimeException: Unable to start activity ComponentInfo{cPreferencesActivity}: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1748) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1764) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.app.ActivityThread.access$1500(ActivityThread.java:122) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1002) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.os.Looper.loop(Looper.java:132) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.app.ActivityThread.main(ActivityThread.java:4025) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at java.lang.reflect.Method.invoke(Method.java:491) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at dalvik.system.NativeStart.main(Native Method) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045): Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.app.SharedPreferencesImpl.getString(SharedPreferencesImpl.java:203) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.preference.Preference.getPersistedString(Preference.java:1367) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.preference.ListPreference.onSetInitialValue(ListPreference.java:278) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.preference.Preference.dispatchSetInitialValue(Preference.java:1283) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.preference.Preference.onAttachedToHierarchy(Preference.java:1095) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.preference.PreferenceGroup.addPreference(PreferenceGroup.java:156) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.preference.PreferenceGroup.addItemFromInflater(PreferenceGroup.java:97) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.preference.PreferenceGroup.addItemFromInflater(PreferenceGroup.java:38) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.preference.GenericInflater.rInflate(GenericInflater.java:488) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.preference.GenericInflater.rInflate(GenericInflater.java:493) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.preference.GenericInflater.inflate(GenericInflater.java:326) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.preference.GenericInflater.inflate(GenericInflater.java:263) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:269) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.preference.PreferenceActivity.addPreferencesFromResource(PreferenceActivity.java:1333) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at PreferencesActivity.onCreate(PreferencesActivity.java:33) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1712) 
10-03 21:13:06.828: ERROR/AndroidRuntime(3045):  ... 11 more 
+0

Giải pháp này làm việc cho tôi: http://stackoverflow.com/a/4644908/1665320 – user1665320

+0

chỉ việc thêm điều này có thể là do nếu bạn trả về một số nguyên làm Giá trị mặc định từ 'Ob ject onGetDefaultValue (TypedArray a, int index) ' –

Trả lời

15

Bạn đã khăng khăng một Integer trước trong các ưu đãi. ListActivity mong đợi một String để truyền không thành công.

Chỉ cần gọi mã này vào đầu onCreate để loại bỏ các giá trị sai và điều này cần được cố định:

PreferenceManager.getDefaultSharedPreferences(this).edit().remove("dayFilter").commit(); 

Nếu nó vẫn xảy ra hơn có lẽ bạn đang sử dụng dayFilter gấp đôi then chốt cho sở thích khác nhau hoặc hãy tự duy trì khóa đó với tư cách là Integer ở đâu đó trong mã của bạn.

Nếu điều này không làm việc sau đó cố gắng loại bỏ sở thích của bạn từ các địa điểm này:

/data/data/YOUR_PACKAGE_NAME/shared_prefs/YOUR_PREFS_NAME.xml 
/data/data/YOUR_PACKAGE_NAME/shared_prefs/YOUR_PACKAGE_NAME_preferences.xml 

// on some devices 
/dbdata/databases/YOUR_PACKAGE_NAME/shared_prefs/YOUR_PREFS_NAME.xml 

Nếu điều này thất bại, cố gắng gỡ bỏ cài đặt ứng dụng vì vậy họ cần được loại bỏ (điều này không hoạt động trên Samsung của tôi Galaxy S - chia sẻ sở thích sẽ không bị xóa ...)

+0

Cảm ơn bạn đã đề xuất nhưng điều đó không hiệu quả. Ngoài ra tôi đã kiểm tra XML và tôi chỉ sử dụng dayFilter làm khóa một lần. –

+0

Vui lòng đăng toàn bộ stacktrace của bạn sau đó. Vì vậy, chúng ta có thể thấy nơi ngoại lệ này được ném. – Knickedi

+0

Tôi đã đưa nó vào bài đăng đầu tiên của mình. –

-1

tập tin XML của bạn không được viết một cách chính xác, bạn khai báo một mảng của chuỗi nhưng bạn cung cấp số nguyên do đó Cast ngoại lệ.

<string-array name="dayFilterValues"> 
<item>0</item> 
... 
<item>365</item> 
    </string-array> 

Để khắc phục nó chỉ cần đặt dấu ngoặc kép quanh các giá trị số nguyên:

<item>"365"</item> 

Sau đó, trong ứng dụng của bạn, bạn cần phải phân tích chuỗi thành một Integer với:

int value = Integer.parseInt(str); 
+0

Tôi đã thử với các chuỗi có số và nó vẫn xảy ra. –

+0

bạn có thể đăng thông điệp logcat khi bạn làm điều này không? – slayton

+3

-1 'ListPreference' gọi' persistString (value) 'nội bộ, do đó, nó sẽ luôn luôn tồn tại một chuỗi (không bao giờ nguyên) – Knickedi

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