¿Cómo hacer que un oyente para un botón de cancelar datepickers en Android?
Estoy usando un datepicker en Android para permitir al usuario elegir la fecha. Quiero que haga una cosa si el usuario escoge una fecha y lo establece (tengo que trabajar bien) y luego para borrar un cierto campo de texto si el usuario empuja el botón de cancelar en el datepicker (abrir el datepicker pero luego cancelar De ella).
La manera que he estado intentando es haciendo una
- El nombre del mes aparece con el número M + en el cuadro de diálogo datePicker en android
- Android DatePicker / Diálogo que muestra mes / s incorrecto usando la fecha min / max
- ¿Cómo se utilizan los skins personalizados de Datepicker y Timepicker?
- Diseño de material Android Inline Datepicker issue
- DatePicker no funciona al intentar utilizarlo
private DatePickerDialog.OnCancelListener mDateCancelListener = new DatePickerDialog.OnCancelListener() { public void onCancel(DialogInterface dialog) { timeClear(); //method that clears text field } };
Entonces lo hago
TimePickerDialog timeDialog = new TimePickerDialog(this, mTimeSetListener, c.get(Calendar.HOUR), c.get(Calendar.MINUTE), false); timeDialog.setOnCancelListener(mTimeCancelListener);
Para conectar al oyente.
Mi problema es que el oyente funciona si el usuario empuja el botón de retroceso, pero no si presionan el botón de cancelar. He intentado usar un oyente de despedir, y que funciona, a excepción del hecho de que se apaga incluso si establecer o cancelar el datepicker!
¿Qué necesito hacer para que algo se apague si y sólo si presiono el botón de cancelar en mi datepicker?
- Cuadro de diálogo selector de fecha en editar texto haga doble clic
- Cómo crear un nuevo cuadro de diálogo "circle" datepicker android
- Diálogo de selección de fecha y hora
- ¿Establecer límite en DatePickerDialog en Android?
- Capaz de elegir la fecha futura al establecer la fecha máxima en datepicker
- Eliminar el año de DatePickerDialog
- Android DatePicker mostrar el nombre del mes
- Getdate de datepicker android
La única solución, el contador intuitivo, es que usted necesita "anular" el botón de cancelar:
timeDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // do stuff } });
Puede crear una variable booleana isDataSet y en dateSetListener realizar isDataSet = true; Y luego adjuntar onDismissListener con dicho código:
if(isDataSet) //Data was set and neither back nor cancel button was clicked else //back or cancel button was clicked
Pero no olvide establecer isDataSet = false cada vez que cree un diálogo.
Bueno después de algunos experimentos he encontrado que lo que se necesita es un OnDismissListener como se muestra a continuación. Tenga en cuenta que he desarrollado mi solución para un TimePickerDialog, pero setOnDismissListener se hereda de diálogo por lo que debería funcionar igual para un DatePickerDialog.
timeDialog.setOnDismissListener(mOnDismissListener); private DialogInterface.OnDismissListener mOnDismissListener = new DialogInterface.OnDismissListener() { public void onDismiss(DialogInterface dialog) { _logger.v("mOnDismissListener called"); timeClear(); } };
He probado esto y funciona. De hecho, he encontrado que el OnDismissListener se llama en ambos escenarios que usted menciona, cuando el usuario hace clic en el botón Cancelar y cuando golpean el botón de hardware atrás. Así que sólo necesita este manejador.
Por último, ahora que sé qué para google, he encontrado este artículo que describe la diferencia entre un OnDismissListener y un OnCancelListener, en la sección sobre "Utilizar Descartar oyentes":
Prueba esto:
timeDialog.getButton(TimePickerDialog.BUTTON_NEGATIVE).setOnClickListener(mTimeCancelListener);
(Tendrá que cambiar mTimeCancelListener para implementar DialogInterface.OnClickListener
lugar de OnCancelListener
)
La solución completa (probada y funcionando) es combinar el OnDismissListener (véase la respuesta 3 de Kenneth Baltrinic) junto con el booleano onDateSet descrito por dilix (1 respuesta anterior). Usted necesita tanto porque el onDismiss se utiliza en todos los casos: (1) el usuario ha seleccionado los datos reales (2) el usuario ha cancelado (3) el usuario ha pulsado el botón de hardware atrás.
El uso de la combinación le permite diferenciar entre ellos.
Esta es la solución. Puede ayudar a cualquiera
datePickerDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { if (which == DialogInterface.BUTTON_NEGATIVE) { // do something } } });