2010-12-05 14 views
21

Ceci est ma première application Android et j'ai rencontré une exception lors de la tentative d'utilisation de ListPreference. L'application se charge avec les préférences ... mais lorsque je touche l'entrée ListPreference, les applications "s'arrêtent de manière inattendue".Exception 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> 

C'est la sortie 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

Veuillez poster les informations LogCat. Cela nous aiderait tous à vous aider avec l'exception. –

+0

Je vois logcat est une commande adb mais je ne sais pas comment l'utiliser ... pourriez-vous me le dire? – PedroC88

+0

Utilisez-vous Eclipse ADT? Ou les outils de ligne de commande? –

Répondre

48

Je l'ai réparé ... J'ai continué à essayer et, à la fin, il s'avère que je ne peux pas utiliser un nombre entier comme source entryValues. J'ai juste changé ce tableau entier en un tableau de chaînes et l'ai fait fonctionner.

S'il existe un moyen d'utiliser un tableau d'entiers comme source pour entryValues, veuillez commenter.

+16

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

+0

Est-ce que quelqu'un a remarqué que cela fonctionne très bien dans Android 2.3 mais vous obtenez cette erreur dans 4.0 +? – JPM

+8

Sérieusement ... C'est scandaleux que personne n'ait réparé ça depuis 2009! – lixonn

1

J'ai cherché une solution similaire à ce que vous cherchez, en convenant que vous devriez être capable d'utiliser un tableau Integer pour lire et stocker un résultat entier.

Une solution à ce problème que j'ai trouvé était à http://kvance.livejournal.com/1039349.html, que j'ai trouvé utile. Cela ne résout pas tout à fait le problème de la façon dont je pensais ou de la façon dont je le voulais, mais vous spécifiez toujours vos valeurs initiales/de sélection avec un tableau String bien que lorsque ListPreference le sauvegarde dans SharedPreferences il enregistre en tant qu'entier au lieu d'une chaîne (en effectuant la conversion lorsque l'utilisateur le sélectionne), ce qui évite d'avoir à le convertir plusieurs fois dans votre application lors de l'accès à la valeur de préférence.

+0

Le code référencé est loin d'être une solution complète et nécessite de surcharger les autres méthodes parentes (y compris le constructeur) afin d'éviter les exceptions. – Stan