2014-12-01 3 views
0

우선, 제 영어는 유감입니다.오리엔테이션 변경 후 사용자 지정 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]; 
     } 
    }; 
} 

}

답변

4

UPDATE :

, 적절한 솔루션을 것 아래의 솔루션은 그냥 빨리 해킹 (그리고 권장되는 방법 없음)주의하시기 바랍니다 onSaveInstanceState 중에 값을 유지 한 다음 활동을 다시 작성한 후에 해당 값을 가져 오는 것이 좋습니다.

This post은 구성 변경 사항을 정상적으로 처리하기 위해 반드시 읽어야합니다.

ORIGINAL 답변 :

어쩌면이 매니페스트 파일에서 관련 활동 태그 내부에이 줄을 추가하는 데 도움이됩니다

android:configChanges="orientation|screenSize" 

이에서 onCreate가 호출되지 않도록 할 때 화면 회전 , 당신은 안드로이드 운영 체제에, 이봐, 난 당신이 onCreate에서 다시 시작하지 않아도이 활동에 대한 자신을 회전 물건을 처리 할 것입니다.

+0

감사합니다 ... 완벽합니다. :) 그리고 설명에 감사드립니다. 'state.getClass() ...'메소드가 'hu.test.android.demo.ui.DayPreference & SavedState'대신 'android.preference.DialogPreference & SavedState'를 반환했습니다. 아마 그것이 이유 였을까요? – wyzard

+0

언제든지 :) –

+0

매우 나쁜 해결책, [이유는 여기를 참조] (http://stackoverflow.com/a/7990543/5288316) –