2011-10-03 17 views
6

Estoy tratando de agregar una preferencia de lista a mi aplicación. Mi código XML es el siguiente:Android se bloquea en 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> 

Y mis valores de la matriz son:

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

Sin embargo cuando intento entrar en mi menú de preferencias se estrella con la siguiente excepción:

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

Que se refiere a esta línea de código:

addPreferencesFromResource(R.xml.preferences); 

¿Alguna idea sobre esto y por qué está sucediendo? Gracias.

COMPLETO seguimiento de la pila:

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

Esta solución trabajó para yo: http://stackoverflow.com/a/4644908/1665320 – user1665320

+0

solo agregando esto podría deberse a que si devuelve un entero como valor predeterminado de 'Ob ject onGetDefaultValue (TypedArray a, índice int) ' –

Respuesta

15

Ha persistido un Integer antes en las preferencias. ListActivity espera un String por lo que el molde falla.

Sólo tiene que llamar este código al principio de onCreate para eliminar el valor incorrecto y esto debe fijarse:

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

Si todavía ocurre que es probable que el uso de la dayFilter doble clave para diferentes preferencias o persista esa clave por su cuenta como Integer en algún lugar de su código.

Si esto no funciona, entonces intente extraer sus preferencias desde esta ubicación:

/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 

Si esto falla, intente desinstalar la aplicación por lo que deben ser eliminados (esto no funciona en mi Samsung Galaxy S - comparten las preferencias no se eliminan ...)

+0

Gracias por la sugerencia pero eso no funcionó. También he comprobado el XML y solo estoy usando el filtro de día como clave una vez. –

+0

Por favor, publique su stacktrace completo a continuación. Entonces podemos ver dónde se lanza esta excepción. – Knickedi

+0

Lo he incluido en mi publicación inicial. –

-1

el archivo XML no está escrito correctamente, se declara un array de cadenas sino que proporcionas enteros por lo tanto la excepción de difusión.

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

solucionarlo simplemente poner comillas alrededor de los valores enteros:

<item>"365"</item> 

Luego, en su aplicación que necesita para analizar la cadena en un entero con:

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

He intentado con cadenas donde están los números y todavía sucede. –

+0

puede publicar el mensaje de logcat cuando hace esto? – slayton

+3

-1 'ListPreference' llama' persistString (value) 'internamente, por lo que siempre se conservará una cadena (nunca entero) – Knickedi

Cuestiones relacionadas