81 votes

ListPreference : utiliser string-array comme entrée et integer-array comme valeurs d'entrée ne fonctionne pas

J'utilise dans un fichier settings.xml une ListPreference. Je veux montrer à l'utilisateur une liste de 3 options à sélectionner ; lorsque l'utilisateur choisit l'une des options dans les paramètres, j'obtiens cette erreur :

07-05 16:31:25.117: E/AndroidRuntime(30415): FATAL EXCEPTION: main
07-05 16:31:25.117: E/AndroidRuntime(30415): java.lang.NullPointerException
07-05 16:31:25.117: E/AndroidRuntime(30415):    at android.preference.ListPreference.onDialogClosed(ListPreference.java:264)
07-05 16:31:25.117: E/AndroidRuntime(30415):    at android.preference.DialogPreference.onDismiss(DialogPreference.java:381)
07-05 16:31:25.117: E/AndroidRuntime(30415):    at android.app.Dialog$ListenersHandler.handleMessage(Dialog.java:1228)
07-05 16:31:25.117: E/AndroidRuntime(30415):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-05 16:31:25.117: E/AndroidRuntime(30415):    at android.os.Looper.loop(Looper.java:137)
07-05 16:31:25.117: E/AndroidRuntime(30415):    at android.app.ActivityThread.main(ActivityThread.java:4424)
07-05 16:31:25.117: E/AndroidRuntime(30415):    at java.lang.reflect.Method.invokeNative(Native Method)
07-05 16:31:25.117: E/AndroidRuntime(30415):    at java.lang.reflect.Method.invoke(Method.java:511)
07-05 16:31:25.117: E/AndroidRuntime(30415):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-05 16:31:25.117: E/AndroidRuntime(30415):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-05 16:31:25.117: E/AndroidRuntime(30415):    at dalvik.system.NativeStart.main(Native Method)

C'est le code de la ListPreference :

<ListPreference
    android:entries="@array/date_alignement"
    android:entryValues="@array/date_alignement_values"
    android:key="settings_date_alignement"
    android:summary="@string/settings_date_alignement_summary"
    android:title="@string/settings_date_alignement_title" />

Et voici les arrérages que j'utilise pour remplir les entrées :

<string-array name="date_alignement">
    <item>"Top"</item>
    <item>"Center"</item>
    <item>"Bottom"</item>
</string-array>
<integer-array name="date_alignement_values">
    <item >0</item>
    <item >1</item>
    <item >2</item>
</integer-array>

Dans mon onSharedPreferenceChanged, j'utilise ces valeurs de cette façon :

@Override
public void onSharedPreferenceChanged(
            SharedPreferences sharedPreferences, String key) {          

        //Text
        mAlignment =  mPrefs.getInt(PREF_ALIGNMENT, 1);
        switch (mAlignment) {
        case 0:
            offsetY = mHeight/3.0f;
            break;

        case 2:
            offsetY = mHeight*2.0f/3.0f;
            break;

        default:
            offsetY = mHeight/2.0f;
            break;
        }

}

Si j'utilise pour le valeurs d'entrée une autre chaîne de caractères, cela fonctionne. Par exemple, si j'utilise le même tableau de chaînes de caractères comme valeurs et entrées :

    android:entries="@array/date_alignement"
    android:entryValues="@array/date_alignement"

alors je dois changer un peu mon code mais ça marche :

        if(mAlignment.equalsIgnoreCase("center")) {
            offsetY = mHeight/2.0f;
        } else if(mAlignment.equalsIgnoreCase("top")) {
            offsetY = mHeight/3.0f;
        } else if(mAlignment.equalsIgnoreCase("bottom")) {
            offsetY = mHeight*2.0f/3.0f;
        }

Pourquoi je ne peux pas utiliser un strig-array et un integer-array pour les entrées et les valeurs d'une ListPreference ?

93voto

Egor Points 15923

La réponse est simple : parce que le système Android est conçu de cette façon. Il utilise simplement String des tableaux pour les entrées et les valeurs d'entrée et c'est tout. Et je ne vois pas de problème à cela, puisque vous pouvez facilement convertir un fichier String à un int en utilisant le Integer.parseInt() méthode. J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X