0

Androidの簡単なガイドといくつかのグーグルを使用して、独自の番号ピッカー設定を作成しました。私の質問は onSaveInstanceState() メソッドに関するものです。Google のチュートリアルでは、 isPersistent() メソッドを使用して設定が永続的かどうかを判断し、永続的である場合は単にスーパーステートを返すことをお勧めします。この条件では、番号ピッカーを新しい番号にスワイプしてから画面を回転させると、回転したバージョンが永続化された値に戻るため、私はそうしませんでした。この条件を削除すれば、すべて問題ありません。しかし、edittextpreferenceのような他の設定のソースコードを確認すると、この条件が存在し、値を保存されていない値に変更してから画面を回転させても状態が保存されます..誰かがそれを説明してもらえますか? これが私のコードです:

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];
                    }
                };
    }

}

ありがとう:)

4

1 に答える 1

0

それをテストせずに、変更する必要があるかもしれないと仮定します

private final String time;

private String time;

String.valueOf(time)メソッドに引数として渡し.setSummary()ます。もちろん、オカレンスは.onCreateView()、設定から読み取った値を渡す必要があります。または、何も返されなかった場合は、デフォルト値をフォールバックとして渡す必要があります。より複雑にするよりも、よりシンプルにするようにしてください。

于 2016-07-30T21:45:24.933 に答える