Как заставить слушателя кнопку отмены выбора даты в Android? - PullRequest
8 голосов
/ 27 июня 2010

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

Я пытался сделать

private DatePickerDialog.OnCancelListener mDateCancelListener =
    new DatePickerDialog.OnCancelListener() {
        public void onCancel(DialogInterface dialog) {
            timeClear(); //method that clears text field
        }

    };

тогда я делаю

TimePickerDialog timeDialog = new TimePickerDialog(this,
  mTimeSetListener,
  c.get(Calendar.HOUR),
  c.get(Calendar.MINUTE),
  false);
timeDialog.setOnCancelListener(mTimeCancelListener);

чтобы прикрепить слушателя.

Моя проблема в том, что слушатель работает, если пользователь нажимает кнопку «Назад», но не если он нажимает кнопку «Отмена». Я попытался использовать прослушиватель dismiss, и это работает, за исключением того факта, что он отключается, даже если я установил или отменил средство выбора даты!

Что мне нужно сделать, чтобы что-то пропало, если и только если я нажму кнопку отмены на моем указателе даты?

Ответы [ 6 ]

5 голосов
/ 11 августа 2011

Единственное решение, противоречащее интуитивному принципу, заключается в том, что вам необходимо «переопределить» кнопку отмены:

    timeDialog.setButton(DialogInterface.BUTTON_NEGATIVE,
            getString(R.string.cancel),
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    // do stuff
                }
            });
2 голосов
/ 25 августа 2012

Вы можете создать одну логическую переменную isDataSet и в dateSetListener выполнить isDataSet = true;и затем присоедините onDismissListener с таким кодом:

if(isDataSet)
    //Data was set and neither back nor cancel button was clicked
else
    //back or cancel button was clicked

Но не забывайте устанавливать isDataSet = false каждый раз, когда вы создаете диалог.

1 голос
/ 09 сентября 2015

Это решение.Это может быть полезно для кого-то еще

 datePickerDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            if (which == DialogInterface.BUTTON_NEGATIVE) {
                // do something
            }
        }
    });
1 голос
/ 21 ноября 2010

Хорошо, после некоторых экспериментов я обнаружил, что необходим OnDismissListener, как показано ниже. Обратите внимание, что я разработал свое решение для TimePickerDialog, но setOnDismissListener наследуется от Dialog, поэтому он должен работать так же для DatePickerDialog.

timeDialog.setOnDismissListener(mOnDismissListener);


private DialogInterface.OnDismissListener mOnDismissListener =
    new DialogInterface.OnDismissListener() {
        public void onDismiss(DialogInterface dialog) {
            _logger.v("mOnDismissListener called");
            timeClear();
        }
    };

Я проверил это, и оно работает. Фактически, я обнаружил, что OnDismissListener вызывается в обоих упомянутых вами сценариях, когда пользователь нажимает кнопку «Отмена» и когда он нажимает кнопку «Назад» на оборудовании. Так что вам нужен только один обработчик.

Наконец, теперь, когда я знаю, для чего искать Google, я нашел эту статью , которая описывает разницу между OnDismissListener и OnCancelListener, в разделе «Использование слушателей увольнения»:

0 голосов
/ 14 ноября 2012

Полное решение (проверенное и работающее) - объединить OnDismissListener (см. Ответ Кеннета Балтриника 3 выше) вместе с логическим значением onDateSet, описанным dilix (1 ответ выше). Вы должны оба, потому что onDismiss используется во всех случаях: (1) пользователь выбрал фактические данные (2) пользователь отменил (3) пользователь нажал кнопку возврата оборудования.

Использование комбинации позволяет различать их.

0 голосов
/ 27 июня 2010

Попробуйте:

timeDialog.getButton(TimePickerDialog.BUTTON_NEGATIVE).setOnClickListener(mTimeCancelListener);

(вам придется изменить mTimeCancelListener для реализации DialogInterface.OnClickListener вместо OnCancelListener)

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