Sto implementando la mia sottoclasse DialogPreference personalizzata che ha un SeekBar utilizzato per mantenere un intero. Sono un po 'confuso su cosa deve andare in onSaveInstanceState()
e onRestoreInstanceState()
. In particolare, è necessario aggiornare il widget dell'interfaccia utente con cui l'utente interagisce (nel mio caso, il widget SeekBar) in onRestoreInstanceState()
?Come implementare correttamente onRestoreInstanceState() per una sottoclasse DialogPreference?
La ragione per cui mi sono confuso è che l'articolo API doc here ti dice di fare questo:
@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!
}
Ma guardando il sorgente per alcune classi privilegiate Android ufficiali (EditTextPreference e ListPreference), il widget UI è non aggiornato in onRestoreInstanceState()
. Solo il valore sottostante della preferenza è (nell'esempio sopra, che sarebbe mNewValue
).
Qui è la fonte rilevante per 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!
}
Allora, qual è il consenso? Dove dovrei aggiornare il widget UI (se devo aggiornarlo del tutto ...)?
I metodi 'setValue' e' setMaxValue' che hai definito nel tuo 'DialogPreference 'personalizzato? In tal caso potresti pubblicare il codice per questi metodi? – whatyouhide
@whatyouhide Sì. Vedi la mia risposta aggiornata. –
Mmmm, grazie. Il mio problema è che il mio 'DialogPreference.getValue()' recupera il valore da alcuni 'View's all'interno della finestra di dialogo, e quelle viste sono ancora puntatori' nulli' quando vengono richiamati 'onSaveInstanceState' e' onRestoreInstanceState'. – whatyouhide