2010-08-22 7 views
7

Ich bin neu bei der Verwendung der PreferenceActivity.PreferenceActivity gibt eine NullPointerException, wenn die Option aus ListPreference ausgewählt wurde

Aufgabe: Benutzer erlauben das Programm das Layout von den Einstellungen

Problem zu wählen: Auswählen einer Option im PreferenceList verursacht eine Nullpointer

Ausnahme entsteht: Bei android.preference.ListPreference .onDialogClosed()

alt text

(Verkürzte) Code:

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> 

Die Bit-Code, der nie dort wird das ausgeführt wird protokolliert OnSharedPreferencesChanged.

Kann jemand sehen, wo ich falsch gelaufen bin?

BEARBEITEN. Hier ist die Spitze des Stack-Trace:

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

Sie sagen, dass die Ausnahme in .onDialogClosed ist(), aber ich kann diese Methode in Ihrem Code nicht sehen ... – Sephy

+0

Können Sie nach einem LogCat-Ausgabe? –

+2

Der Stack-Trace wurde hinzugefügt. @Sephy: Der onDialogClosed kommt von der ListPreference, nicht mein eigener Code – HXCaine

Antwort

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

Das wird fehlschlagen, weil die Präferenz eine Zeichenkette ist, kein Int.

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

Ändern Sie diese zu <string-array>. Hier ist a sample project demonstriert die Verwendung eines .

+0

Das Ändern der Arrays in String-Arrays scheint das Problem zu beheben, aber ich müsste meine Klassen ändern, um stattdessen mit Strings zu arbeiten. Ich möchte diese Einstellungen wirklich als Ints speichern, weißt du, was ich ändern müsste, damit alles mit Ints funktioniert? – HXCaine

+5

@ T3Roar: 'ListPreference' unterstützt Strings. Wenn Sie etwas anderes möchten, müssen Sie Ihre eigene Präferenzklasse schreiben. – CommonsWare

+0

oder Sie können eine hashmap in Ihrer Klasse haben, um die Zeichenkette mit den Ints abzubilden, wenn das wirklich das ist, was Sie brauchen. – Sephy

0

Ich glaube, Sie brauchen Zuhörer Präferenz Änderung für Ihre Vorlieben einzustellen direkt an der Aktivität, zu versuchen, das zu der onCreate Aktivität setzen:

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

Auf welche Aktivität beziehen Sie sich? Es hat Fehler sowohl für die Hauptaktivität als auch für die Präferenz-Aktivität. – HXCaine

+0

Bei zweiter Überlegung würde ich lieber die Wurzel des Problems finden als diese Art von Hack, um es zu beheben. Obwohl es mich veranlaßt hat, einen anderen Teil des Zugriffs auf freigegebene Einstellungen zu suchen, die stören könnten. – HXCaine

Verwandte Themen