studio reales proyectos programacion libro introducción incluye herramientas fundamentos fuente español código crear con avanzado aplicaciones java android dialog android-2.2-froyo datepickerdialog

java - reales - Detener el cierre del DatePickerDialog cuando se usa hace clic en el botón Establecer



libro de android studio en español pdf (1)

Implementé DatePickerDialog usando el ejemplo que se muestra aquí .

En mi implementación de DatePickerDialog.OnDateSetListener agregué la lógica de validación para verificar que la fecha seleccionada esté dentro del rango específico.

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 ? } } };

El problema que tengo es que DatePickerDialog se cierra automáticamente cuando el usuario hace clic en el botón Establecer y quiero mantener el DatePickerDialog abierto si falla la regla de validación.

¿Alguien sabe cómo detener el cierre del DatePickerDialog cuando el usuario hace clic en el botón Establecer?


Desde la API 11, el DatePicker puede validar su fecha por usted.

Siguiendo la guía a la que se refiere , al anular en CreateDialog, obtener DatePicker y establecer la fecha mínima y máxima:

@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; }

De esta forma, el usuario no puede elegir una fecha incorrecta, por lo que no es necesario validarla manualmente.

Para versiones anteriores, puede usar un booleano para control cuando se permite el cierre e implementar su propia lógica. Aquí trato de ilustrar dónde necesitarás extender tu código:

@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(); }