0

android's brief guideとグーグルを使用して自分の番号ピッカーの設定を書きました。私の質問はonSaveInstanceState()メソッドに関するものです。 Googleのチュートリアルでは、メソッドisPersistent()を使用して設定が永続的であるかどうかを判断し、そうであればスーパーステートを返すことをお勧めします。この条件では、番号ピッカーを新しい番号にスワイプしてから画面を回転すると、回転したバージョンは永続化された値に戻ります。私がこの状態を取り除くと、すべてが大丈夫です。しかし、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() 1つのことは手動で処理する必要があります(通常は嗜好の値を表示するように指定されていないため、頻繁に濫用されています)。 –

+0

@ michaelg9 'onConfigurationChanged()'も関連して、画面の向きの変更に関する問題に対処することができます。 –

関連する問題