1

Ich habe ein Projekt, das ich in Android Studio erstelle. Ich habe den vorgefertigten Einstellungsbildschirm mit Fragmenten hinzugefügt, die kompiliert und gut laufen. Ich habe eine MultiSelectListPreference zu einem der Einstellungsbildschirme hinzugefügt, die Feineinstellungen anzeigt und Voreinstellungen speichert. Der DefaultValue funktioniert jedoch nicht, egal ob ich ihn über Java oder XML hinzufüge. Ich habe die Punkte anderer Fragen darüber gelesen, wie das geht. Ich weiß wie. Meine Frage ist, was könnte dazu führen, dass es nicht wie vorgesehen funktioniert?MultiSelectListPreference defaultValues ​​funktioniert nicht

pref_general.xml

<MultiSelectListPreference 
    android:key="@string/pref_key_starting_addresses" 
    android:summary="@string/pref_description_addresses" 
    android:title="@string/pref_title_addresses" 
    android:entries="@array/empty_array" 
    android:entryValues="@array/empty_array" /> 

PreferenceActivity.java

/** 
* This method autopopulates a MultiSelectListPreference with array values 
* loaded from XML. 
*/ 
private void populateMultiSelectListPreference() { 
    List<TypedArray> origins = ResourceHelper.getMultiTypedArray(mContext, "origins"); 
    CharSequence[] entries = new CharSequence[origins.size()]; 
    CharSequence[] values = new CharSequence[origins.size()]; 
    int counter = 0; 
    for (TypedArray item : origins) { 
     entries[counter] = item.getString(0); 
     values[counter] = String.valueOf(counter); 
     counter++; 
    } 

    final MultiSelectListPreference lp = (MultiSelectListPreference) findPreference(getString(R.string.pref_key_starting_addresses)); 
    lp.setEntries(entries); 
    lp.setDefaultValue(values); 
    lp.setEntryValues(values); 
} 

arrays.xml

<string-array name="empty_array" /> 

<!-- a number of these are used to generate the MultiSelectListPreference 
    titles and entry values--> 
<array name="origins_0"> 
    <item>Text used for title</item> 
    <item>data 1</item> 
    <item>data 2</item> 
</array> 

Ich weiß, dass alles richtig funktioniert, weil das Debuggen zeigt, dass values eine gültige Set enthält und Speichern von Voreinstellungen funktioniert gut. Dies bedeutet, dass lp.setEntryValues(values) funktioniert und dass values ein ordnungsgemäß formatiertes Set ist. lp.setDefaultValue(values) hat jedoch keine Wirkung. Die Kontrollkästchen sind beim ersten Start deaktiviert. Mein Ziel ist es, sie alle standardmäßig ausgewählt zu haben.

Ja, ich habe den Befehl Clean and rerun 'app' aus dem Menü Ausführen von Android Studio zwischen den Tests verwendet. Außerdem habe ich den App-Cache manuell auf dem Gerät gelöscht.

[EDIT]

Mit Vorschläge in den Kommentaren, ich habe auch versucht, die folgende Änderung.

private void populateMultiSelectListPreference() { 
    List<TypedArray> origins = ResourceHelper.getMultiTypedArray(mContext, "origins"); 
    CharSequence[] entries = new CharSequence[origins.size()]; 
    CharSequence[] values = new CharSequence[origins.size()]; 
    Set<String> defaults = new HashSet<>(); 
    int counter = 0; 
    for (TypedArray item : origins) { 
     entries[counter] = item.getString(0); 
     values[counter] = String.valueOf(counter); 
     defaults.add(String.valueOf(counter)); 
     counter++; 
    } 

    final MultiSelectListPreference lp = (MultiSelectListPreference) findPreference(getString(R.string.pref_key_starting_addresses)); 
    lp.setEntries(entries); 
    lp.setEntryValues(values); 
    lp.setDefaultValue(defaults); 
} 
+0

wo rufen Sie 'populateMultiSelectListPreference' auf? – pskink

+1

Es gibt keinen Grund, warum es nicht direkt in XML funktionieren könnte. Können Sie das, was Sie mit XML versucht haben, und die damit verbundenen Arrays posten? –

+0

Halten Sie das Array nicht leer. Versuchen Sie, dem string-array in arrays.xml Elemente hinzuzufügen. – WannaBeGeek

Antwort

0

Eine schnelle Vermutung hier, aber ich frage mich, ob der Grund, nur die Reihenfolge ist, dass Sie Ihre Werte fordern, würde ich die Standardwerte im letzten Schritt legen Sie die vollständige Liste Erwägung ziehen, sollte zunächst initialisiert werden:

final MultiSelectListPreference lp = (MultiSelectListPreference) findPreference(getString(R.string.pref_key_starting_addresses)); 
lp.setEntries(entries); 
lp.setEntryValues(values); 
lp.setDefaultValue(values); 
+0

Die Reihenfolge der Methoden scheint keine Auswirkung zu haben. Ich habe auch einen Vorschlag aus einem anderen Kommentar mit einem Set anstelle der CharSequence [] versucht. Keine funktionierte, selbst wenn "setDefaultValue" zuletzt aufgerufen wurde. Interessanterweise sagt die Android-Dokumentation, dass setDefaultValue ein Objekt als Parameter akzeptiert. Weitere Untersuchungen zeigen, dass es von der Preference-Klasse geerbt wird. Ich frage mich, ob das MSLP dies mit einer benutzerdefinierten Implementierung überschreiben sollte. – Nilpo

Verwandte Themen