2011-10-03 96 views
6

我正在嘗試將listpreference添加到我的應用程序中。我的XML代碼如下:ListPreference上的Android崩潰

<?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> 

我的數組的值是:

<?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> 

然而,當我試圖進入它與下面的異常崩潰我的偏好菜單:

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

它是指這行代碼:

addPreferencesFromResource(R.xml.preferences); 

對此有任何想法,爲什麼會發生?謝謝。

FULL堆棧跟蹤:

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

該解決方案爲我: http://stackoverflow.com/a/4644908/1665320 – user1665320

+0

只是增加這可能是由於如果您返回一個整數作爲默認值從'Ob ject onGetDefaultValue(TypedArray a,int index)' –

回答

15

您已在首選項之前持續的IntegerListActivity預計String所以投射失敗。

onCreate開始就叫這個代碼刪除了錯誤的價值,這應該是固定的:

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

如果它仍然發生比你可能使用dayFilter兩次爲不同的偏好或關鍵在你的代碼的某個地方,你自己堅持這個密鑰爲Integer

如果不工作,然後嘗試從這個位置刪除自己的喜好:

/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 

如果這樣做失敗了,嘗試卸載應用程序,以便他們應該被刪除(這不會對我的三星工作GALAXY S - 共享偏好不被刪除......)

+0

謝謝你的建議,但沒有奏效。另外我已經檢查過XML,而且我只使用dayFilter作爲關鍵一次。 –

+0

然後請發佈您的完整堆棧跟蹤。所以我們可以看到這個異常拋出的位置。 – Knickedi

+0

我已將它列入我的初始文章。 –

-1

你的XML文件沒有正確地寫入,你聲明的數組,但您提供整數因此轉換異常。

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

要修復它只是把周圍的整數值報價:

<item>"365"</item> 

然後在你的應用程序,你需要將字符串解析爲一個整數:

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

我已經嘗試過使用字符串的數字,它仍然發生。 –

+0

當你這樣做時,你可以發佈logcat消息嗎? – slayton

+3

-1'ListPreference'在內部調用'persistString(value)',所以它總是會持續一個字符串(從不是整數) – Knickedi