android listpreference

android - ListPreference: usa string-array como Entry y integer array como Entry Values no funciona



(3)

La respuesta es simple: porque el Android está diseñado de esta manera. Simplemente utiliza matrices de String tanto para entradas como para valores de entrada, y eso es todo. Y no puedo ver ningún problema en este hecho, ya que puedes convertir fácilmente una String a un int usando el método Integer.parseInt() . Espero que esto ayude.

Estoy usando en un archivo settings.xml un ListPreference. Quiero mostrar al usuario una lista de 3 opciones para seleccionar. Cuando el usuario elige una de las opciones en la Configuración, aparece este error:

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

Este es el código del 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" />

Y aquí están las matrices que utilizo para rellenar las entradas:

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

En mi onSharedPreferenceChanged, uso esos valores de esta manera:

@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 utilizo otra cadena de cadenas para la entrada de valores , funciona. Por ejemplo, si uso la misma matriz de cadenas como valores y entradas:

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

Luego tengo que cambiar un poco mi código pero funciona:

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; }

¿Por qué no puedo usar un array de cadenas y un array de enteros para las entradas y valores de ListPreference?


La respuesta se enumera en la lista de documentos de preferencia .

int findIndexOfValue (String value)

devolverá el índice para el valor dado y el argumento se toma como una cadena, por lo que la matriz entryValues ​​debe ser una matriz de cadena para obtener este trabajo.


Lo siguiente me funcionó:

String objectName = prefs.getString("listPrefMelodyYd1", ""); switch (objectName.toUpperCase()) { case "1": playSound(catSound); break; case "2": playSound(dogSound); break; case "3": playSound(cowSound); break; }