Пользовательский DatePicker в качестве предпочтения не сохраняет значение, когда пользователь редактирует значение в поле - PullRequest
6 голосов
/ 23 ноября 2010

Я создал DatePickerPreference, то есть я расширил DialogPreference и создал объект DatePicker внутри, и он работал почти идеально. Он изменяет значения при нажатии стрелок вверх и вниз и сохраняет выбранное значение.

Однако, если вы щелкнете внутри поля и введете новое значение, оно не сохранит обновленное значение! При использовании стрелок всегда вызывается метод onDateChanged (); когда пользователь входит в поле и редактирует его, он будет вызывать onDateChanged только в том случае, если он выберет другое поле (и в этом случае, если он редактирует последнее поле и просто нажимает кнопку ОК, последнее изменение будет игнорироваться). Я обнаружил, что Эрик Безетт опубликовал аналогичную проблему с его TimePickerPreference

Вот мой код:


    public class DatePickerPreference extends DialogPreference implements  
OnDateChangedListener, OnDateSetListener {

    @Override
    protected View onCreateDialogView() {
        DatePicker picker = new DatePicker(getContext());
        mDate = getPersistedLong(System.currentTimeMillis());

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(mDate);

        int day = calendar.get(Calendar.DAY_OF_MONTH);
        int month = calendar.get(Calendar.MONTH);
        int year = calendar.get(Calendar.YEAR);

        picker.init(year, month, day, this);
        return picker;
    }

    public void onDateChanged(DatePicker view, int year, int monthOfYear,  
            int dayOfMonth) {
        mDate = (new Date(year - 1900, monthOfYear, dayOfMonth)).getTime();
    }

    public void onDateSet(DatePicker view, int year, int monthOfYear,  
            int dayOfMonth) {
        onDateChanged(view, year, monthOfYear, dayOfMonth);
    }

    @Override
    public void setDefaultValue(Object defaultValue) {
        super.setDefaultValue(String.valueOf((  
            new Date(String.valueOf(defaultValue))).getTime()));
    }

    @Override
    protected void onDialogClosed(boolean positiveResult) {
        super.onDialogClosed(positiveResult);

        if(positiveResult) {
            if(isPersistent()) {
                persistLong(mDate);
            }
            callChangeListener(String.valueOf(mDate));
        }
    }

    public int getYear() { /*(...)*/ }
    public int getMonth() { /*(...)*/ }
    public int getDay() { /*(...)*/ }

    public DatePickerPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public DatePickerPreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public void init() { setPersistent(true); }
    public void setDate(Date date) { mDate = date.getTime(); }
    public void setDate(long milisseconds) { mDate = milisseconds; }

    public String getDate(int style) {
        return DateFormat.getDateInstance(style).format(new Date(mDate));
    }

    public long getDate() { return mDate; }

    private long mDate;
    public static final int DATE_SHORT = DateFormat.SHORT;
    public static final int DATE_MEDIUM = DateFormat.MEDIUM;
    public static final int DATE_LONG = DateFormat.LONG;
    public static final int DATE_FULL = DateFormat.FULL;
    public static final int DATE_DEFAULT = DateFormat.DEFAULT;
}

Ответы [ 3 ]

1 голос
/ 15 августа 2011

Поскольку этот класс расширяет класс DialogPreference, он уже обрабатывает изменение SharedPreference с помощью кнопок.Чтобы правильно обновить переменную даты после того, как пользователь введет новую дату, вам нужно обновить SharedPreference вручную.

Вы можете сделать это следующим образом:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor preferences = prefs.edit();
preferences.putLong("mdate_key", mDate.getTime());
preferences.commit();

Здесь mdate_key будет соответствовать ключу DatePickerPreference, используемому в XML-файле PreferenceActivity.

Я рекомендуюили делать это в onDateChanged() или onDestroy().

0 голосов
/ 05 июля 2012

У меня была такая же проблема. Решение очень простое. Средство выбора даты обновляет отредактированные значения только тогда, когда оно теряет фокус, поэтому перед получением значений вы должны вызвать:

datePicker.clearFocus();

После этого звонка вы можете позвонить:

selectedDay = datePicker.getDayOfMonth();
selectedMonth = datePicker.getMonth();

и обновите значения.

0 голосов
/ 01 февраля 2012

Пожалуйста, взгляните на библиотеку DatePreference:

http://mikeburnscoder.wordpress.com/2010/09/27/datepreference-an-android-library/
https://github.com/bostonandroid/DatePreference

Это должно решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...