2010-08-22 7 views
7

Soy nuevo en el uso de PreferenceActivity.PreferenceActivity da una excepción NullPointerException cuando se selecciona de ListPreference

Tarea: Permitir al usuario elegir el diseño del programa de las preferencias

Problema: seleccionando una opción en el PreferenceList provoca una NullPointerException surge

Excepción: En android.preference.ListPreference .onDialogClosed()

alt text

(abreviado) Código:

private static final String PREF_LAYOUT_KEY = "PrefLayout"; 
private static final int DEFAULT_LAYOUT = LayoutHelper.LAYOUT_DOUBLE ; 
private static int mListLayout = DEFAULT_LAYOUT ; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); 
    pref.registerOnSharedPreferenceChangeListener(this); 
    mListLayout = pref.getInt(PREF_LAYOUT_KEY, DEFAULT_LAYOUT); 
} 

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

    Log.v(TAG, "OnSharedPreferencesChanged run"); // TODO Testing Purposes 

    if(key.equals(PREF_LAYOUT_KEY)){ 
     mListLayout = pref.getInt(key, DEFAULT_LAYOUT); 
    } 
} 

[PreferenceActivity]

public class Preferences extends PreferenceActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     addPreferencesFromResource(R.xml.pref); 
    } 
} 

[res/xml/pref.xml]

<PreferenceCategory 
    android:title="@string/pref_cat1_title"> 

    <ListPreference 
     android:title="@string/pref_layout_name" 
     android:summary="@+id/pref_chosen_layout" 
     android:key="PrefLayout" 
     android:entries="@array/prefLayoutOptions" 
     android:entryValues="@array/prefLayoutOptionsValues" 
    /> 
</PreferenceCategory> 

[strings.xml]

<string name="pref_cat1_title">Layout</string> 
    <string name="pref_layout_name">"Layout of list"</string> 
     <array name="prefLayoutOptions"> 
      <item>Layout 1 (single)</item> 
      <item>Layout 2 (double)</item> 
      <item>Layout 3 (triple)</item> 
      <item>Layout 4 (quad)</item> 
     </array> 
     <array name="prefLayoutOptionsValues"> 
      <item>50</item> 
      <item>51</item> 
      <item>52</item> 
      <item>53</item> 
     </array> 

El trozo de código que registra OnSharedPreferencesChanged se ejecuta nunca pasa de ahí.

¿Alguien puede ver dónde me he equivocado?

EDITAR. Aquí está la parte superior de la traza de la pila:

E/AndroidRuntime(2707): java.lang.NullPointerException 
E/AndroidRuntime(2707):  at android.preference.ListPreference.onDialogClosed(ListPreference.java:218) 
E/AndroidRuntime(2707):  at android.preference.DialogPreference.onDismiss(DialogPreference.java:384) 
E/AndroidRuntime(2707):  at android.app.Dialog$ListenersHandler.handleMessage(Dialog.java:1047) 
E/AndroidRuntime(2707):  at android.os.Handler.dispatchMessage(Handler.java:99) 
+0

Usted dice que la excepción está en .onDialogClosed() pero no puede ver este método en su código ... – Sephy

+0

Se puede publicar una Salida LogCat? –

+2

Acaba de agregar el seguimiento de la pila. @Sephy: el onDialogClosed es de la ListPreference, no es mi propio código – HXCaine

Respuesta

19
mListLayout = pref.getInt(PREF_LAYOUT_KEY, DEFAULT_LAYOUT); 

Eso fallará, porque la preferencia es una cadena, no un int.

<array name="prefLayoutOptions"> 
<array name="prefLayoutOptionsValues"> 

Cambiar a <string-array>. Aquí está a sample project demostrando el uso de un ListPreference.

+0

Cambiar las matrices a las matrices de cadenas parece solucionar el problema, pero tendría que cambiar mis clases para tratar con cadenas en su lugar. Me gustaría guardar estas preferencias como si fuesen cosas, ¿sabes lo que necesitaría cambiar para que todo funcione bien? – HXCaine

+5

@ T3Roar: 'ListPreference' admite cadenas. Si quieres algo más, necesitarás escribir tu propia clase de preferencia. – CommonsWare

+0

o puede tener un hashmap en su clase para mapear la cadena con los enteros si eso es realmente lo que necesita. – Sephy

0

creo que es necesario para establecer el cambio de preferencias de escucha para sus preferencias a la derecha en la actividad, trate de poner eso a onCreate de la actividad:

Map<String, ?> prefs = this.getPreferenceManager().getSharedPreferences().getAll(); 
    for (String preferenceName : prefs.keySet()) { 
     Preference p = this.findPreference(preferenceName); 
     if (p != null) { 
      Object value = prefs.get(preferenceName); 
      p.setOnPreferenceChangeListener(this); 
     } 
    } 
+0

¿A qué actividad se refiere? Tiene errores para la actividad principal o la actividad de Preferencias – HXCaine

+0

Pensándolo bien, preferiría encontrar la raíz del problema que hacer este tipo de hack para solucionarlo. Aunque me ha avisado para buscar otro poco de acceso a las preferencias compartidas que pueden estar interfiriendo – HXCaine

Cuestiones relacionadas