私は自分のカスタムDialogPreferenceサブクラスを実装しています。このサブクラスには、整数を保持するためのSeekBarがあります。私はonSaveInstanceState()
とonRestoreInstanceState()
に入る必要があることについて少し混乱しています。具体的には、ユーザが対話するUIウィジェット(私の場合はSeekBarウィジェット)をonRestoreInstanceState()
に更新する必要がありますか?私は混乱していますDialogPreferenceサブクラスに対してonRestoreInstanceState()を正しく実装する方法は?
理由は、APIドキュメントの記事hereこれを行うためにあなたを伝えることです:
@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!
}
しかし、いくつかの公式Androidの優先クラス(EditTextPreferenceとListPreference)のソースを見て、UIウィジェットがされonRestoreInstanceState()
で更新されていません。優先度の基礎となる値のみ(上記の例では、mNewValue
)です。ここで
が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!
}
、コンセンサスは何ですか? UIウィジェットを更新するはずです(もし私がUIウィジェットを更新しなければならないのなら...)?
カスタム 'DialogPreference'で定義した' setValue'と 'setMaxValue'メソッドはありますか?もしそうなら、それらのメソッドのコードを投稿できますか? – whatyouhide
@whatyouhideはい。私の更新された答えを見てください。 –
Mmmm、ありがとう。私の問題は、 'DialogPreference.getValue()'がダイアログ内のいくつかの 'View'sから値を取得し、' onSaveInstanceState'と 'onRestoreInstanceState'が呼び出されたときにこれらのビューが' null'ポインタであることです。 – whatyouhide