0

android's brief guide 및 인터넷 검색을 사용하여 내 번호 선택기 환경 설정을 작성했습니다. 내 질문에 onSaveInstanceState() 메서드에 관한 것입니다. Google의 자습서에서는 isPersistent() 메서드를 사용하여 환경 설정이 영구적인지 여부를 확인하고 그렇다면 superstate를 반환하는 것이 좋습니다. 이 조건으로 번호 선택 도구를 새 번호로 스 와이프 한 다음 화면을 회전하면 회전 된 버전이 지속 된 값으로 돌아갈 것이기 때문에 나는 그렇게하지 않았습니다. 이 조건을 제거하면 모든 것이 정상입니다. 그러나 edittextpreference와 같은 다른 환경 설정의 소스 코드를 검사하면이 조건이 존재하며 값을 저장하지 않은 상태로 변경하고 화면을 회전해도 상태가 저장됩니다. 누군가 설명해 주실 수 있습니까? 당신이사용자 환경 설정 isPersistent()

private final String time; 

private String time; 

을 변경하고 String.valueOf(time)을 통과해야 할 수도 있습니다 가정 것, 그것을 테스트하지 않고

public class NumberPreference extends DialogPreference { 
    private final static int DEFAULT_VALUE=R.integer.timer_def; 
    private final static int DEFAULT_MIN_VALUE=R.integer.timer_min_def; 
    private final static int DEFAULT_MAX_VALUE=R.integer.timer_max_def; 
    private final int min; 
    private final int max; 
    private final String time; 

    private int timer; 
    private NumberPicker numberPicker; 


    public NumberPreference(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setDialogLayoutResource(R.layout.number_preference); 
     setNegativeButtonText("Cancel"); 
     setPositiveButtonText("OK"); 
     TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.number_preference, 0, 0); 
     try{ 
      min=a.getInteger(R.styleable.number_preference_min, DEFAULT_MIN_VALUE); 
      max=a.getInteger(R.styleable.number_preference_max, DEFAULT_MAX_VALUE); 
      time=a.getString(R.styleable.number_preference_time); 
     }finally{ 
      a.recycle(); 
     } 
     setDialogIcon(null); 
    } 

    public void setSummary() { 
     super.setSummary("Every "+getTimer()+' '+time); 
    } 

    @Override 
    protected View onCreateView(ViewGroup parent) { 
     setSummary(); 
     return super.onCreateView(parent); 
    } 

    @Override 
    protected void onDialogClosed(boolean positiveResult) { 
     if (positiveResult) { 
      int number = numberPicker.getValue(); 
      if (callChangeListener(number)){ 
       timer=number; 
       persistInt(timer); 
       setSummary(); 
      } 
     } 
    } 

    @Override 
    protected Object onGetDefaultValue(TypedArray a, int index) { 
     return a.getInt(index,DEFAULT_VALUE); 
    } 

    @Override 
    protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) { 
     if (restorePersistedValue) { 
      timer = getPersistedInt(DEFAULT_VALUE); 
     } 
     else{ 
      timer =(Integer) defaultValue; 
      persistInt(timer); 
     } 
    } 

    @Override 
    protected void onBindDialogView(View view) { 
     super.onBindDialogView(view); 
     numberPicker=(NumberPicker) view.findViewById(R.id.numpref_picker); 
     numberPicker.setMinValue(min); 
     numberPicker.setMaxValue(max); 
     numberPicker.setValue(timer); 

    } 

    public int getTimer() { 
     return getPersistedInt(DEFAULT_VALUE); 
    } 

    @Override 
    protected Parcelable onSaveInstanceState() { 
     final Parcelable superState = super.onSaveInstanceState(); 
     if (isPersistent()) { 
      return superState; 
     } 
     final SavedState myState=new SavedState(superState); 
     if (numberPicker!= null) myState.value=numberPicker.getValue(); 
     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()); 
     if (numberPicker!=null)numberPicker.setValue(myState.value); 
    } 

    private static class SavedState extends BaseSavedState { 
     // field that holds the setting's value 
     int value; 

     public SavedState(Parcelable superState) { 
      super(superState); 
     } 

     public SavedState(Parcel source) { 
      super(source); 
      // Get the current preference's value 
      value = source.readInt(); 
     } 

     @Override 
     public void writeToParcel(Parcel dest, int flags) { 
      super.writeToParcel(dest, flags); 
      // Write the preference's value 
      dest.writeInt(value); 
     } 

     // Standard creator object using an instance of this class 
     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]; 
        } 
       }; 
    } 

} 

감사합니다 :)

답변

0

: 다음은 내 코드입니다 방법으로 인수로 .setSummary(). 물론, .onCreateView()의 발생은 환경 설정에서 읽은 값을 전달해야합니다. 반환되지 않은 값이 있으면 폴백으로 기본값을 전달해야합니다. 더 복잡한 것보다 더 단순하게 만들려고 노력하십시오.

+0

안녕하세요, syslogic 님, 답변 해 주셔서 감사합니다. 어쩌면 나는 그 문제를 정말로 잘 설명하지 않았을 것이다. 문자열 시간은 요약에서 변수 일 뿐이며, 그것은 내가 염려하는 것이 아닙니다. 문제는 내가 그 조건을 가지고 번호 선택 도구를 열려면 클릭하고, 영구 번호보다 다른 번호로 스 와이프하고 마침내 화면을 회전 시키면 숫자 선택기가 영구 값으로 돌아갑니다. 그 조건을 제거하면 회전 된 숫자 피커가 회전하기 전에 바꾼 값을 가리키게됩니다 – michaelg9

+0

@ michaelg9 G +에서 계속 토론하면서 계속 작업하기를 바랍니다. 그럼에도 불구하고 setSummary() 메소드가 있어야합니다. 단 하나의 것은 수동으로 처리해야합니다 (보통 선호도의 값을 표시하도록 지정되지 않았기 때문에 - 심지어 자주 남용되는 경우도 있음). –

+0

@ michaelg9 onConfigurationChanged() 또한 화면 방향 변경 문제를 해결하기 위해 적합 할 수 있습니다. –

관련 문제