2012-07-05 12 views
56

Estoy usando en un archivo settings.xml una ListPreference. Quiero mostrarle al usuario una lista de 3 opciones para seleccionar. Cuando el usuario elige una de las opciones en la configuración, me sale este error:ListPreference: use string-array como Entry and integer-array como Entry Values ​​no funciona

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

y aquí están las matrices que utilizo para poblar 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 utilizo esos valores en esta forma:

@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 uso otro conjunto de cadenas para el entryValues ​​ funciona. Por ejemplo si uso la misma matriz de cadenas como valores y entradas:

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

entonces tengo que cambiar mi código un poco, 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 utilizar un String array y una matriz de enteros para las entradas y valores de ListPreference?

+0

estoy Sory para la pregunta estúpida, pero ¿qué tipo de mAlignment variables se utilizan? y de dónde sacaste PREF_ALIGNMENT? – Yarik

+0

En el primer caso, la alineación es un int. PREF_ALIGNMENT es el nombre de la entrada en las SharedPreferences, donde el valor actual de alineación está almacenado – Santacrab

Respuesta

73

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

+21

OK, todavía no entiendo por qué no es compatible. Obviamente puedo y voy a convertirlo, pero si es posible usar una estructura específica (entero-matriz) en lugar de usar la cadena uno y convertirlo en int, debería funcionar :) ¡Gracias de todos modos! – Santacrab

+3

@Santacrab, si hubiera una compatibilidad de matriz entera, también debería haber compatibilidad con matriz flotante, doble, char, etc. Sería un gran desastre, así que creo que es más fácil convertir una cadena al tipo de datos que necesite. Acepta la respuesta si la has encontrado útil. – Egor

+1

en realidad existe la estructura de matriz de enteros. El problema es que no funciona cuando se combina con la cadena uno. – Santacrab

3

La respuesta se enumera en List Preference Documentation.

int findIndexOfValue (String value) 

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

-2

A continuación trabajó para mí:

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

Describa el problema correctamente. –

Cuestiones relacionadas