Ich implementiere meine eigene benutzerdefinierte DialogPreference-Unterklasse mit einer SeekBar, die für die Persistenz einer Ganzzahl verwendet wird. Ich bin ein wenig verwirrt darüber, was in onSaveInstanceState()
und onRestoreInstanceState()
gehen muss. Müssen Sie das UI-Widget, mit dem der Benutzer interagiert (in meinem Fall das SeekBar-Widget), in onRestoreInstanceState()
aktualisieren?Wie kann onRestoreInstanceState() für eine DialogPreference-Unterklasse ordnungsgemäß implementiert werden?
Der Grund, warum ich verwirrt bin, ist, dass der API doc Artikel here Sie, dies zu tun sagt:
für einige offiziellen Android Preference Klassen an der Quelle@Override
protected Parcelable onSaveInstanceState() {
final Parcelable superState = super.onSaveInstanceState();
if (isPersistent()) {
return superState;
}
final SavedState myState = new SavedState(superState);
myState.value = mNewValue; //<------------ saves mNewValue
return myState;
}
@Override
protected void onRestoreInstanceState(Parcelable state) {
if (state == null || !state.getClass().equals(SavedState.class)) {
super.onRestoreInstanceState(state);
return;
}
SavedState myState = (SavedState) state;
super.onRestoreInstanceState(myState.getSuperState());
mNumberPicker.setValue(myState.value); //<------------ updates the UI widget, not mNewValue!
}
Aber ein Blick (EditTextPreference und ListPreference), der UI-Widget ist nicht aktualisiert in onRestoreInstanceState()
. Nur der zugrunde liegende Wert der Präferenz ist (im obigen Beispiel wäre das mNewValue
).
Hier ist die relevante Quelle für EditTextPreference:
@Override
protected Parcelable onSaveInstanceState() {
final Parcelable superState = super.onSaveInstanceState();
if (isPersistent()) {
return superState;
}
final SavedState myState = new SavedState(superState);
myState.value = getValue(); //<---- saves mValue
return myState;
}
@Override
protected void onRestoreInstanceState(Parcelable state) {
if (state == null || !state.getClass().equals(SavedState.class)) {
super.onRestoreInstanceState(state);
return;
}
SavedState myState = (SavedState) state;
super.onRestoreInstanceState(myState.getSuperState());
setValue(myState.value); //<---- updates mValue, NOT the UI widget!
}
Also, was ist der Konsens? Wo soll ich das UI Widget aktualisieren (wenn ich es überhaupt aktualisieren soll ...)?
Sind 'setValue' und' setMaxValue' Methoden, die Sie in Ihrer benutzerdefinierten 'DialogPreference' definiert haben? Wenn ja, könnten Sie den Code für diese Methoden veröffentlichen? – whatyouhide
@whatyouhide Ja. Siehe meine aktualisierte Antwort. –
Mmmm, danke. Mein Problem ist, dass mein 'DialogPreference.getValue()' den Wert von einigen 'View's innerhalb des Dialogs abruft, und diese Views sind immer noch 'null' Zeiger, wenn' onSaveInstanceState' und 'onRestoreInstanceState' aufgerufen werden. – whatyouhide