Кнопка отмены TimePickerDialog не сбрасывает данные

Я знаю, что это спрашивали много раз, но я не могу найти ответ, подходящий для моей проблемы.

Итак, у меня есть действие, в котором есть кнопка, где ее текст - это текущее время (время доступа к действию). Я могу нажать кнопку, чтобы отобразить TimePickerDialog, где я могу изменить время, нажать кнопку «Установить», и кнопка обновится с новым временем. Пока все так хорошо, так просто.

Моя проблема в том, что если я запускаю TimePicker, меняю время, нажимаю кнопку «Отмена», а затем снова запускаю TimePicker, отображаемое время — это время, которое я отменил, а не исходное время с кнопки, которая его запустила. Если я отменю TimePicker, я хочу, чтобы он забыл все предыдущие данные.

Вот мой код:

protected Dialog onCreateDialog(int id) {
    switch (id) {
    case TIME_DIALOG_ID:
        recordTime = new TimePickerDialog(this,mTimeSetListener, mHour, mMinute, true);
        recordTime.setOnCancelListener(new OnCancelListener(){

            @Override
            public void onCancel(DialogInterface arg0) {

final Calendar c = Calendar.getInstance();
                mHour = c.get(Calendar.HOUR_OF_DAY);
                mMinute = c.get(Calendar.MINUTE);
                recordTime.dismiss();
            }
        });

        recordTime.setOnDismissListener(new OnDismissListener(){
            @Override
            public void onDismiss(DialogInterface arg0) {
                recordTime.cancel();
                recordTime.dismiss();
            }

        });
        return recordTime;

    }
    return null;
}


// the callback received when the user sets the time in the dialog
    private TimePickerDialog.OnTimeSetListener mTimeSetListener =
        new TimePickerDialog.OnTimeSetListener() {
            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                mHour = hourOfDay;
                mMinute = minute;
                updateTimeDisplay();
            }
        };

person DaveSav    schedule 22.08.2012    source источник


Ответы (2)


Если я отменю TimePicker, я хочу, чтобы он забыл все предыдущие данные.

Каждый раз, когда диалог открывается с помощью showDialog(), он проходит через onPrepareDialog(), просто сбросьте время здесь. Если пользователь нажал Set, новое время сохраняется в mHour и mMinute, если диалог по какой-либо причине отменен, это восстанавливает исходные данные:

@Override
protected void onPrepareDialog(int id, Dialog dialog, Bundle args) {
    switch (id) {
    case TIME_DIALOG_ID:
        recordTime.updateTime(mHour, mMinute);
    }
}

Вы также можете легко вызвать это в OnCancelListener:

recordTime.setOnCancelListener(new OnCancelListener() {
    @Override
    public void onCancel(DialogInterface dialog) {
        recordTime.updateTime(mHour, mMinute);
    }
});

Также ваши исходные слушатели OnCancel и OnDismiss кажутся избыточными. Что вы пытаетесь с ними сделать?

Вы должны знать, что onDismiss() вызывается, если пользователь нажимает Set, Cancel или использует кнопку "Назад". Если пользователь нажимает Set, вы не хотите вызывать метод onCancel() onDismiss(). Не рассматривайте onCancel() и onDismiss() как одни и те же методы.

person Sam    schedule 22.08.2012
comment
Спасибо. Я обнаружил, что просто использование onPrepareDialog помогло. Использование .setOnCancelListener само по себе не восстанавливало исходное время. - person DaveSav; 24.08.2012
comment
Можно проверить текущий код здесь stackoverflow.com/questions/4724781/ также - person Deepti; 31.10.2017

Вы никогда не сбрасываете дату. Если вы сбросите дату/время в методе onCancel, все должно работать нормально.

person ahodder    schedule 22.08.2012
comment
Как бы я это сделал? В качестве быстрого теста я добавил окончательный Calendar c = Calendar.getInstance(); mHour = c.get(Calendar.HOUR_OF_DAY); mMinute = c.get(Календарь.МИНУТА); но это не помогло. - person DaveSav; 23.08.2012
comment
Я изменил свой пример кода, чтобы включить ваше предложение; но это все еще не работает - person DaveSav; 23.08.2012