2010-06-26 6 views
8

Estoy usando un datepicker en Android para permitir que el usuario elija la fecha. Quiero que haga una cosa si el usuario elige una fecha y la establece (tengo que funcionar bien) y luego borrar un cierto campo de texto si el usuario presiona el botón cancelar en el selector de fecha (abre el selector de fecha pero luego cancela de eso).¿Cómo hacer un oyente para un botón para cancelar la fecha en Android?

La forma en que he estado tratando 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 unir el oyente.

Mi problema es que el oyente funciona si el usuario presiona el botón Atrás, pero no si presiona el botón cancelar. Intenté usar un oyente de descarte, y eso funciona, ¡excepto por el hecho de que se apaga incluso si configuro o cancelo el datepicker!

¿Qué debo hacer para que algo suene si y solo si presiono el botón cancelar en mi selector de fecha?

+0

Estoy tratando de hacer exactamente lo mismo pero con el selector de fecha. En la solución propuesta a continuación, la aplicación se bloquea porque .getButton (TimePickerDialog.BUTTON_NEGATIVE) devuelve nulo. ¿Alguien tiene una solución para esto? –

+1

Compruebe esto [1]: http://stackoverflow.com/questions/2928902/can-we-get-cancel-click-listerner-of-datepicker-dialog – W00di

Respuesta

0

Prueba esto:

timeDialog.getButton(TimePickerDialog.BUTTON_NEGATIVE).setOnClickListener(mTimeCancelListener); 

(Vas a tener que cambiar mTimeCancelListener para implementar DialogInterface.OnClickListener en lugar de OnCancelListener)

+0

Gracias por la respuesta! Todavía estoy teniendo un pequeño problema. Si hago un DialogInterface.OnClickListener y trato de usarlo para el TimePicker, me dice que necesito echarlo primero. Si lo hago, entonces el programa simplemente se bloquea al hacer clic en el botón para abrir el TimePicker. Si no lo hace, entonces dice setOnClickListener (android.view.View.OnClickListener) en android.view.View no se puede aplicar a (android.content.DialogInterface.OnClickListener) timeDialog.getButton (TimePickerDialog.BUTTON_NEGATIVE) .setOnClickListener (dateTimeClickCancelListener); – Adam

+0

Y traté de crear un View.OnClickListner() en lugar de un DialogInterfaceListener, y el programa simplemente falla cuando intento abrir el cuadro de diálogo TimePicker – Adam

1

bien después de algunos experimentos que he encontrado que lo que se necesita es un OnDismissListener como se muestra a continuación . Tenga en cuenta que desarrollé mi solución para un TimePickerDialog, pero setOnDismissListener se hereda de Dialog, 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 descubierto que se llama al OnDismissListener en los dos escenarios que menciona, cuando el usuario hace clic en el botón Cancelar y cuando presionan el botón de retroceso de hardware. Entonces solo necesitas este manejador único.

Por último, ahora que sé lo que a Google para, encontré this article que describe la diferencia entre un OnDismissListener y un OnCancelListener, en el apartado de "Uso Descartar oyentes":

+0

Esto no es lo que se solicitó - onDismiss se activa sin importar qué botón se presione, pero el póster quiere saber cuándo se presionó el botón Cancelar. También afirman que ya han probado con un oyente de Desistimiento. – barry

+0

@barry buen punto ... Lo que me parece interesante es que el "onCancelListener" no tiene nada que ver con el botón Cancelar en el cuadro de diálogo datePicker. El comentario de W00di es la respuesta correcta ... así que es posible duplicarlo. – giulio

4

La única solución, contrario a la intuición, es que se necesita para el botón de cancelar "anular":

timeDialog.setButton(DialogInterface.BUTTON_NEGATIVE, 
      getString(R.string.cancel), 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        // do stuff 
       } 
      }); 
+0

Esto también llama al método OnTimeSet. Entonces, secuencialmente llama al oyente negativo y luego al oyente positivo. –

2

puede crear una variable booleana isDataSet y en dateSetListener realizar isDataSet = true; y luego coloque onDismissListener con un código de este tipo:

if(isDataSet) 
    //Data was set and neither back nor cancel button was clicked 
else 
    //back or cancel button was clicked 

Pero no se olvide de establecer isDataSet = false cada vez que se crea un cuadro de diálogo.

0

La solución completa (probada y en funcionamiento) es combinar el OnDismissListener (ver la respuesta 3 de Kenneth Baltrinic) junto con el booleano onDateSet descrito por dilix (1 respuesta más arriba). Necesita ambos porque el onDismiss se usa 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 retroceso de hardware.

El uso de la combinación le permite diferenciar entre ellos.

0

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 
      } 
     } 
    }); 
Cuestiones relacionadas