2011-10-03 31 views
6

Sto tentando di aggiungere un listpreference alla mia applicazione. Il mio codice XML è il seguente:Arresto anomalo di Android su 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> 

E i miei valori di matrice sono:

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

Tuttavia quando provo ad inserire il mio menu di preferenza si blocca con la seguente eccezione:

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

Che si riferisce a questa riga di codice:

addPreferencesFromResource(R.xml.preferences); 

Qualche idea su questo e perché sta succedendo? Grazie.

PIENO dello stack:

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

Questa soluzione ha funzionato per me: http://stackoverflow.com/a/4644908/1665320 – user1665320

+0

aggiungere questo potrebbe essere dovuto a se si restituisce un numero intero come Valore predefinito da 'Ob ject onGetDefaultValue (TypedArray a, indice int) ' –

risposta

15

Hai persistito un Integer prima nelle preferenze. ListActivity si aspetta un cast di String.

Basta chiamare questo codice all'inizio del onCreate per rimuovere il valore errato e questo deve essere fissato:

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

Se succede ancora che probabilmente stai utilizzando la dayFilter il doppio tasto per le diverse preferenze o fai persistere quella chiave da sola come Integer da qualche parte nel tuo codice.

Se questo non funziona, allora provare a rimuovere le preferenze da questa località:

/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 

Se questo fallisce, provare a disinstallare l'applicazione in modo che dovrebbe essere rimosso (questo non funziona sul mio Samsung Galaxy S - hanno condiviso le preferenze non vengono eliminati ...)

+0

Grazie per il suggerimento ma non ha funzionato. Inoltre ho controllato l'XML e sto usando il dayFilter solo come chiave una volta. –

+0

Si prega di inviare il vostro stacktrace completo quindi. Quindi possiamo vedere dove viene generata questa eccezione. – Knickedi

+0

L'ho incluso nel mio post iniziale. –

-1

il file XML non è scritto correttamente, si dichiara un array di stringhe ma che fornisci interi da qui l'eccezione Cast.

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

per risolvere il problema semplicemente mettere le virgolette attorno ai valori interi:

<item>"365"</item> 

Poi nella vostra applicazione è necessario analizzare la stringa in un intero con:

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

Ho provato con le stringhe dove sono i numeri e succede ancora. –

+0

puoi postare il messaggio logcat quando lo fai? – slayton

+3

-1 'ListPreference' chiama' persistString (value) 'internamente, quindi rimarrà sempre una stringa (mai integer) – Knickedi

Problemi correlati