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