Пользовательские настройки isPersistent()

Я написал свое собственное предпочтение выбора номера с помощью краткого руководства для Android и некоторого поиска в Google. Мой вопрос касается метода 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];
                    }
                };
    }

}

Спасибо:)

1 ответ

Не проверив, возможно, вам придется изменить

private final String time;

в

private String time;

и передать String.valueOf(time) в качестве аргумента в .setSummary() метод. Конечно, возникновение в .onCreateView() потребуется передать значение, считанное из предпочтений, или значение по умолчанию как запасной вариант, если ничего не было возвращено. попробуйте сделать более простым, чем более сложным.

Другие вопросы по тегам