Остановка закрытия DatePickerDialog, когда пользователь нажимает кнопку "Установить"
Я реализовал DatePickerDialog
используя пример, показанный здесь.
В моей реализации DatePickerDialog.OnDateSetListener
Я добавил логику проверки, чтобы убедиться, что выбранная дата находится в определенном диапазоне.
private final DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int y, int m,
int d) {
final Calendar calendar = Calendar.getInstance();
calendar.set(y, m, d);
Date date = calendar.getTime();
if(!myValidationFunction(date)) {
// date not within allowed range
// cancel closing of dialog ?
}
}
};
У меня проблема в том, что DatePickerDialog
закрывается автоматически, когда пользователь нажимает кнопку установки, и я хочу сохранить DatePickerDialog
открыть, если правило проверки не выполнено.
Кто-нибудь знает, как остановить DatePickerDialog
от закрытия, когда пользователь нажимает кнопку Set?
1 ответ
С API 11 DatePicker может подтвердить вашу дату для вас.
Следуя инструкциям, на которые вы ссылаетесь, при переопределении onCreateDialog получите DatePicker и установите минимальную и максимальную дату:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// no changes from guide ...
final DatePickerDialog dialog = new DatePickerDialog(getActivity(), this, year, month, day);
dialog.getDatePicker().setMinDate(minDate);
dialog.getDatePicker().setMaxDate(minDate);
return dialog;
}
Таким образом, пользователь не может выбрать неправильную дату, поэтому нет необходимости вручную проверять дату.
Для более старых версий вы можете использовать логическое значение для управления, когда закрытие разрешено, и реализовать собственную логику. Здесь я попытаюсь проиллюстрировать, где вам нужно расширить свой код:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final DatePickerDialog dialog = new DatePickerDialog(getActivity(), this, year, month, day){
@Override
public void onBackPressed() {
allowClose = true;
super.onBackPressed();
}
@Override
public void onClick(DialogInterface dialog, int which) {
if (which==DialogInterface.BUTTON_POSITIVE && validate()){
allowClose = true;
}
super.onClick(dialog, which);
}
@Override
public void dismiss() {
if (allowClose) {
super.dismiss();
}
}
};
return dialog;
}
private void onCancelBtnClick() {
allowClose = true;
dismiss();
}