2010-12-16 168 views
6

我想從Reto Meier的Android 2應用程序開發書中獲得一個例子來工作(第202頁)。按照說明我已經創建了一個userpreferences.xml如下:PreferenceActivity中的ClassCastException

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > 
    <CheckBoxPreference 
    android:key="PREF_AUTO_UPDATE" 
    android:title="Auto refresh" 
    android:summary="Select to turn on automatic updating" 
    android:defaultValue="true" 
    /> 
    <ListPreference 
    android:key="PREF_UPDATE_FREQ" 
    android:title="Refresh frequency" 
    android:summary="Frequency at which to refresh earthquake list" 
    android:entries="@array/update_freq_options" 
    android:entryValues="@array/update_freq_values" 
    android:dialogTitle="Refresh frequency" 
    android:defaultValue="60" 
    /> 
    <ListPreference 
    android:key="PREF_MIN_MAG" 
    android:title="Minimum magnitude" 
    android:summary="Select the minimum magnitude earthquake to report" 
    android:entries="@array/magnitude_options" 
    android:entryValues="@array/magnitude" 
    android:dialogTitle="Magnitude" 
    android:defaultValue="3" 
    /> 
</PreferenceScreen> 

我的偏好類看起來像這樣...

public class Preferences extends PreferenceActivity { 
    SharedPreferences prefs; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.userpreferences); 
    } 

我不斷收到一個ClassCastException:java.lang.ClassCastException: java.lang.Integer中

12-16 09:28:14.349: ERROR/AndroidRuntime(287): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dt.sample/com.dt.sample.Preferences}: java.lang.ClassCastException: java.lang.Integer 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.os.Looper.loop(Looper.java:123) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at java.lang.reflect.Method.invoke(Method.java:521) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at dalvik.system.NativeStart.main(Native Method) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287): Caused by: java.lang.ClassCastException: java.lang.Integer 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.app.ContextImpl$SharedPreferencesImpl.getString(ContextImpl.java:2699) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.preference.Preference.getPersistedString(Preference.java:1249) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.preference.ListPreference.onSetInitialValue(ListPreference.java:232) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.preference.Preference.dispatchSetInitialValue(Preference.java:1172) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.preference.Preference.onAttachedToHierarchy(Preference.java:984) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.preference.PreferenceGroup.addPreference(PreferenceGroup.java:156) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.preference.PreferenceGroup.addItemFromInflater(PreferenceGroup.java:97) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.preference.PreferenceGroup.addItemFromInflater(PreferenceGroup.java:38) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.preference.GenericInflater.rInflate(GenericInflater.java:488) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.preference.GenericInflater.inflate(GenericInflater.java:326) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.preference.GenericInflater.inflate(GenericInflater.java:263) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:251) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.preference.PreferenceActivity.addPreferencesFromResource(PreferenceActivity.java:262) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at com.dt.sample.Preferences.onCreate(Preferences.java:24) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
12-16 09:28:14.349: ERROR/AndroidRuntime(287):  ... 11 more 

的arrays.xml看起來像這樣...

<resources> 
    <string-array name="update_freq_options"> 
    <item>Every Minute</item> 
    <item>5 minutes</item> 
    <item>10 minutes</item> 
    <item>15 minutes</item> 
    <item>Every Hour</item> 
    </string-array> 
    <array name="magnitude"> 
    <item>3</item> 
    <item>5</item> 
    <item>6</item> 
    <item>7</item> 
    <item>8</item> 
    </array> 
    <string-array name="magnitude_options"> 
    <item>3</item> 
    <item>5</item> 
    <item>6</item> 
    <item>7</item> 
    <item>8</item> 
    </string-array> 
    <array name="update_freq_values"> 
    <item>1</item> 
    <item>5</item> 
    <item>10</item> 
    <item>15</item> 
    <item>60</item> 
    </array> 
</resources> 

我試過使用integer-array,但沒有幫助。我究竟做錯了什麼?請幫忙。謝謝。

+0

關閉標籤。 2013-08-17 20:05:05

回答

11

我有同樣的問題 - 當保存首選項數據時,本書前面示例中的用戶首選項數據使用不同的數據類型。

解決方案是在啓動AVD時簡單地檢查「清除用戶數據」複選框,以擺脫舊的用戶首選項。

6

如果您將首選項類型從ListPreference更改爲CheckBoxPreference,同時重用相同的密鑰,則會發生此錯誤。

Android框架將在應用程序的shared_prefs/preferences.xml文件中存儲一些默認數據。這些舊值將採用舊格式(例如Int或String,用於ListPreference)而不是布爾型(用於CheckBoxPreference)。

當您加載您的偏好活動時,它會自動加載此XML文件,並導致此崩潰。

解決方案是編輯這個存儲的XML首選項文件(shared_prefs/preferences.xml)並刪除舊的值。或者只是刪除該XML文件。

+0

CheckBoxPreference自動考慮爲布爾值!感謝提及;) – Sdghasemi 2016-01-08 03:25:31