¿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

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?

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 } } }); 
  • Android: ¿Cómo cambiar el color de la fecha seleccionada en un elemento DatePicker?
  • Cómo cambiar el color de la fuente de datepicker?
  • Limitación de fechas de Android DatePicker
  • Forzar cierre cuando los cambios de orientación con fecha abierta DialogueFragment
  • DatePicker muestra el valor incorrecto del mes
  • Android HoneyComb DatePicker Color del texto
  • Implementación de DatePicker en Fragmento
  • La subclase SimpleDateFormat añade 1900 al año
  • Obtener fecha de datepicker usando dialogfragment
  • Android: ¿por qué Callback OnDateChange se llama dos veces?
  • Cómo buscar una fecha de un datepicker en NativeScript
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.