--- Примечание для модераторов: Сегодня (15 июля) я заметил, что кто-то уже столкнулся с этой проблемой здесь. Но я не уверен, если это уместно закрыть это как дубликат, так как я думаю, что я дал гораздо лучшее объяснение этой проблемы. Я не уверен, что я должен отредактировать другой вопрос и вставить этот контент там, но мне не удобно слишком сильно меняться. ---
У меня здесь что-то странное.
Я не думаю, что проблема зависит от того, с каким SDK вы строите против. Версия ОС - это важно.
Проблема №1: непоследовательность по умолчанию
DatePickerDialog
был изменен (?) в желе Bean и теперь только кнопка Готово. Предыдущие версии включали кнопку "Отмена", и это может повлиять на работу пользователя (несогласованность, мышечная память из предыдущих версий Android).
Репликация: Создайте базовый проект. Поместите это в onCreate
:
DatePickerDialog picker = new DatePickerDialog(
this,
new OnDateSetListener() {
@Override
public void onDateSet(DatePicker v, int y, int m, int d) {
Log.d("Picker", "Set!");
}
},
2012, 6, 15);
picker.show();
Ожидаемое: Кнопка "Отмена" появится в диалоговом окне.
Текущее: Кнопка отмены не отображается.
Скриншоты: 4.0.3 (OK) и 4.1.1 (возможно, неправильно?).
Проблема № 2: неправильное поведение отклонения
Диалог вызывает какой бы прослушиватель он действительно вызывал, а затем всегда вызывает OnDateSetListener
прослушиватель. Отмена по-прежнему вызывает метод set, и установка его вызывает метод дважды.
Репликация: Используйте код # 1, но добавьте код ниже (вы увидите, что это решает # 1, но только визуально /UI ):
picker.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.d("Picker", "Cancel!");
}
});
Ожидаемое:
- Нажатие клавиши BACK или нажатие вне диалогового окна должно ничего не делать.
- Нажатие "Отмена" должно печатать Отмена выборa > .
- Нажатие "Set" должно печатать Picker Set!.
Ток:
- Нажатие клавиши BACK или щелчок вне диалогового окна печатает Picker Set!.
- Нажатие "Отмена" печатает Отмена пикара!, а затем Picker Set!.
- Нажатие "Set" печатает Picker Set!, а затем Picker Set!.
Строки журнала, показывающие поведение:
07-15 12:00:13.415: D/Picker(21000): Set!
07-15 12:00:24.860: D/Picker(21000): Cancel!
07-15 12:00:24.876: D/Picker(21000): Set!
07-15 12:00:33.696: D/Picker(21000): Set!
07-15 12:00:33.719: D/Picker(21000): Set!
Другие примечания и комментарии
- Обертка вокруг
DatePickerFragment
не имеет значения. Я упростил проблему для вас, но я ее протестировал.