2010-12-05 8 views
21

Esta es mi primera aplicación de Android y he encontrado una excepción al intentar utilizar ListPreference. La aplicación se carga junto con las preferencias ... pero cuando toco la entrada ListPreference, las aplicaciones "se detienen inesperadamente".Excepción en ListPreferences

Settings.java

public class Settings extends PreferenceActivity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.addPreferencesFromResource(R.layout.settings); 
    } 
} 

settings.xml

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen 
xmlns:android="http://schemas.android.com/apk/res/android"> 
    <CheckBoxPreference 
     android:key="chk_enabled" 
     android:summary="SMS response based on settings" 
     android:title="Enable" 
    /> 
    <ListPreference 
     android:title="Contacts" 
     android:summary="Contacs that will be sent SMSs" 
     android:key="list_contacts" 
     android:defaultValue="0" 
     android:entries="@array/list_entries" 
     android:entryValues="@array/list_values" 
    /> 
</PreferenceScreen> 

arrays.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string-array name="list_entries"> 
     <item>All</item> 
     <item>WhiteList</item> 
     <item>BlackList</item> 
    </string-array> 

    <integer-array name="list_values"> 
     <item>0</item> 
     <item>1</item> 
     <item>2</item> 
    </integer-array> 
</resources> 

Esta es la salida logcat:

D/AndroidRuntime(3187): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<< 
D/AndroidRuntime(3187): CheckJNI is OFF 
D/AndroidRuntime(3187): --- registering native functions --- 
I/jdwp (3187): received file descriptor 16 from ADB 
/ddm-heap(3187): Got feature list request 
I/ActivityManager( 86): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=tml.UI.main/.MainActivity } 
D/AndroidRuntime(3187): Shutting down VM 
D/dalvikvm(3187): DestroyJavaVM waiting for non-daemon threads to exit 
I/ActivityManager( 86): Start proc tml.UI.main for activity tml.UI.main/.MainActivity: pid=3194 uid=10039 gids={1015} 
D/dalvikvm(3187): DestroyJavaVM shutting VM down 
D/dalvikvm(3187): HeapWorker thread shutting down 
D/dalvikvm(3187): HeapWorker thread has shut down 
D/jdwp (3187): JDWP shutting down net... 
D/jdwp (3187): +++ peer disconnected 
I/dalvikvm(3187): Debugger has detached; object registry had 1 entries 
D/dalvikvm(3187): VM cleaning up 
D/dalvikvm(3187): LinearAlloc 0x0 used 676380 of 4194304 (16%) 
I/jdwp (3194): received file descriptor 10 from ADB 
D/ddm-heap(3194): Got feature list request 
W/Resources(3194): Converting to string: TypedValue{t=0x10/d=0x0 a=-1} 
I/ActivityManager( 86): Displayed activity tml.UI.main/.MainActivity: 977 ms (total 977 ms) 
D/AndroidRuntime(3194): Shutting down VM 
W/dalvikvm(3194): threadid=3: thread exiting with uncaught exception (group=0x4001da28) 
E/AndroidRuntime(3194): Uncaught handler: thread main exiting due to uncaught exception 
E/AndroidRuntime(3194): java.lang.NullPointerException 
E/AndroidRuntime(3194): at android.preference.ListPreference.findIndexOfValue(ListPreference.java:169) 
E/AndroidRuntime(3194): at android.preference.ListPreference.getValueIndex(ListPreference.java:178) 
E/AndroidRuntime(3194): at android.preference.ListPreference.onPrepareDialogBuilder(ListPreference.java:190) 
E/AndroidRuntime(3194): at android.preference.DialogPreference.showDialog(DialogPreference.java:291) 
E/AndroidRuntime(3194): at android.preference.DialogPreference.onClick(DialogPreference.java:262) 
E/AndroidRuntime(3194): at android.preference.Preference.performClick(Preference.java:811) 
E/AndroidRuntime(3194): at android.preference.PreferenceScreen.onItemClick(PreferenceScreen.java:190) 
E/AndroidRuntime(3194): at android.widget.AdapterView.performItemClick(AdapterView.java:284) 
E/AndroidRuntime(3194): at android.widget.ListView.performItemClick(ListView.java:3246) 
E/AndroidRuntime(3194): at android.widget.AbsListView$PerformClick.run(AbsListView.java:1635) 
E/AndroidRuntime(3194): at android.os.Handler.handleCallback(Handler.java:587) 
E/AndroidRuntime(3194): at android.os.Handler.dispatchMessage(Handler.java:92) 
E/AndroidRuntime(3194): at android.os.Looper.loop(Looper.java:123) 
E/AndroidRuntime(3194): at android.app.ActivityThread.main(ActivityThread.java:4203) 
E/AndroidRuntime(3194): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(3194): at java.lang.reflect.Method.invoke(Method.java:521) 
E/AndroidRuntime(3194): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 
E/AndroidRuntime(3194): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549) 
E/AndroidRuntime(3194): at dalvik.system.NativeStart.main(Native Method) 
I/Process ( 86): Sending signal. PID: 3194 SIG: 3 
I/dalvikvm(3194): threadid=7: reacting to signal 3 
I/dalvikvm(3194): Wrote stack trace to '/data/anr/traces.txt' 
I/Process (3194): Sending signal. PID: 3194 SIG: 9 
I/ActivityManager( 86): Process tml.UI.main (pid 3194) has died. 
I/WindowManager( 86): WIN DEATH: Window{4341fd00 tml.UI.main/tml.UI.main.MainActivity paused=false} 
W/UsageStats( 86): Unexpected resume of com.android.launcher while already resumed in tml.UI.main 
W/InputManagerService( 86): Got RemoteException sending setActive(false) notification to pid 3194 uid 10039 
+0

Por favor, publique la información de LogCat. Eso nos ayudaría a todos aquí para ayudarlo con la excepción. –

+0

Veo que logcat es un comando adb pero no sé cómo usarlo ... ¿podría decirme? – PedroC88

+0

¿Está utilizando Eclipse ADT? O las herramientas de línea de comandos? –

Respuesta

48

Lo arreglé ... Seguí intentando y, al final, resulta que no puedo usar una matriz de enteros como entryValues Fuente. Acabo de cambiar esa matriz de enteros por una matriz de cadenas y la hice funcionar.

Si hay una forma de usar entero-matriz como fuente para entryValues, comente.

+16

http://code.google.com/p/android/issues/detail?id=2096 – vokilam

+0

¿Alguien ha notado que esto funciona bien en Android 2.3 pero se obtiene este error en 4.0 +? – JPM

+8

En serio ... ¡Es indignante que nadie haya solucionado esto desde 2009! – lixonn

1

He estado buscando una solución similar a la que estás buscando, aceptando que deberías poder utilizar una matriz entera para leer y almacenar un resultado entero.

Una solución a este problema que encontré fue en http://kvance.livejournal.com/1039349.html, que encontré útil.

No soluciona el problema del modo en que estaba pensando o de esa manera creo que lo desea, en su lugar todavía especifica sus valores iniciales/de selección con una matriz String aunque cuando ListPreference lo guarda de nuevo en SharedPreferences se guarda como un entero en lugar de una cadena (haciendo la conversión cuando el usuario lo selecciona), eliminando la necesidad de tener que convertirlo posiblemente muchas veces a lo largo de su aplicación al acceder al valor de preferencia.

+0

El código al que se hace referencia está lejos de ser una solución completa y requiere anular otros métodos principales (incluido el constructor) para evitar excepciones. – Stan