우선, 제 영어는 유감입니다.오리엔테이션 변경 후 사용자 지정 DialogPreference가 사라집니다.
환경 설정 화면에서 '요일 선택 마법사'대화 상자를 만들려고합니다. 나는 안드로이드 개발자 사이트와 Stackoverflow에서 코드를 얻었다.
대화 상자가 '잘 작동하며, 값을 저장하고로드합니다 (레이아웃에 NumberPicker 및 TextView가 포함됨). 문제는 다음과 같습니다. 장치 회전시 대화 상자가 사라집니다.
나는이 포럼과 다른 사이트에서 여러 게시물을 읽었지만 행운은 없습니다. 나 좀 도와 줄 수있어? 문제를 찾기까지 지금까지 몇 시간을 보냈지 만 문제를 해결하는 방법을 알 수 없습니다. 감사.
코드 :
package hu.test.android.demo.ui;
import hu.test.android.demo.AMdtApplication;
import hu.test.android.demo.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Parcel;
import android.os.Parcelable;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.View;
import android.widget.NumberPicker;
public class DayPreference extends DialogPreference {
private NumberPicker picker = null;
private static int day;
public static int getDay() {
return day;
}
public DayPreference(Context ctxt, AttributeSet attrs) {
super(ctxt, attrs);
setDialogLayoutResource(R.layout.day_preference);
setPositiveButtonText (TestApplication.getContext().getResources().getString(R.string.save));
setNegativeButtonText (TestApplication.getContext().getResources().getString(R.string.cancel));
}
@Override
protected void onBindDialogView(View v) {
super.onBindDialogView (v);
picker = (NumberPicker) v.findViewById (R.id.day_preference_number_picker);
picker.setMinValue (1);
picker.setMaxValue (30);
picker.setValue (day);
}
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
if (positiveResult) {
if (callChangeListener (day)) {
day = picker.getValue();
persistInt (day);
}
setSummary(getSummary());
}
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
return (a.getString(index));
}
@Override
protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
if (restoreValue) {
if (defaultValue == null) {
day = getPersistedInt (30);
}
else {
day = getPersistedInt ((Integer) defaultValue);
}
}
else {
day = (Integer) defaultValue;
}
setSummary (getSummary());
}
@Override
public CharSequence getSummary() {
return String.valueOf (day) + " " + TestApplication.getContext().getResources().getString(R.string.label_day);
}
// state save & restore
@Override
protected Parcelable onSaveInstanceState() {
final Parcelable superState = super.onSaveInstanceState();
if (isPersistent()) {
return superState;
}
final SavedState myState = new SavedState (superState);
myState.value = day;
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());
// set the value to the picker
picker.setValue (myState.value);
}
private static class SavedState extends BaseSavedState {
public int value;
public SavedState (Parcelable superState) {
super(superState);
}
public SavedState (Parcel source) {
super(source);
value = source.readInt();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(value);
}
// Standard creator object using an instance of this class
@SuppressWarnings("unused")
public static final Parcelable.Creator <SavedState> CREATOR = new Parcelable.Creator <SavedState>() {
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}
public SavedState[] newArray (int size) {
return new SavedState[size];
}
};
}
}
감사합니다 ... 완벽합니다. :) 그리고 설명에 감사드립니다. 'state.getClass() ...'메소드가 'hu.test.android.demo.ui.DayPreference & SavedState'대신 'android.preference.DialogPreference & SavedState'를 반환했습니다. 아마 그것이 이유 였을까요? – wyzard
언제든지 :) –
매우 나쁜 해결책, [이유는 여기를 참조] (http://stackoverflow.com/a/7990543/5288316) –