2010-06-26 9 views
8

Sto utilizzando un DatePicker in Android per consentire all'utente di scegliere la data. Voglio che faccia una cosa se l'utente sceglie una data e la imposta (ho funzionato correttamente) e poi cancella un certo campo di testo se l'utente preme il pulsante annulla sul datepicker (apri il datepicker ma poi annulla di esso).Come rendere un listener per un pulsante di annullamento di datepickers in Android?

Il modo in cui ho cercato è facendo una

private DatePickerDialog.OnCancelListener mDateCancelListener = 
    new DatePickerDialog.OnCancelListener() { 
     public void onCancel(DialogInterface dialog) { 
      timeClear(); //method that clears text field 
     } 

    }; 

poi faccio

TimePickerDialog timeDialog = new TimePickerDialog(this, 
    mTimeSetListener, 
    c.get(Calendar.HOUR), 
    c.get(Calendar.MINUTE), 
    false); 
timeDialog.setOnCancelListener(mTimeCancelListener); 

per collegare l'ascoltatore.

Il mio problema è che l'ascoltatore funziona se l'utente preme il pulsante Indietro, ma non se preme il pulsante Annulla. Ho provato ad usare un ascoltatore di licenziamenti, e questo funziona, a parte il fatto che si spegne anche se ho impostato o cancellato il DatePicker!

Cosa devo fare in modo che qualcosa vada se e solo se premo il pulsante Annulla sul mio Datepicker?

+0

Sto provando a fare la stessa identica cosa ma con il selezionatore di date. Nella soluzione proposta di seguito, l'app si arresta in modo anomalo perché .getButton (TimePickerDialog.BUTTON_NEGATIVE) restituisce null. Qualcuno là fuori ha una soluzione a questo? –

+1

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

risposta

0

Prova questo:

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

(Dovrete cambiare mTimeCancelListener per implementare DialogInterface.OnClickListener invece di OnCancelListener)

+0

Grazie per la risposta! Sto ancora avendo un piccolo problema. Se faccio un DialogInterface.OnClickListener e provo a usarlo per TimePicker, mi dice che ho bisogno di lanciarlo prima. Se lo faccio, allora il programma si blocca semplicemente quando si fa clic sul pulsante per aprire TimePicker. Se non lo fai allora dice setOnClickListener (android.view.View.OnClickListener) in android.view.View non può essere applicato a (android.content.DialogInterface.OnClickListener) timeDialog.getButton (TimePickerDialog.BUTTON_NEGATIVE) .setOnClickListener (dateTimeClickCancelListener); – Adam

+0

E ho provato a creare un View.OnClickListner() invece di un DialogInterfaceListener, e il programma si blocca appena quando provo ad aprire la finestra di dialogo TimePicker – Adam

1

Va bene dopo qualche sperimentazione ho trovato che ciò che è necessario è un OnDismissListener come mostrato di seguito . Nota che ho sviluppato la mia soluzione per TimePickerDialog, ma setOnDismissListener è ereditato da Dialog, quindi dovrebbe funzionare allo stesso modo per DatePickerDialog.

timeDialog.setOnDismissListener(mOnDismissListener); 


private DialogInterface.OnDismissListener mOnDismissListener = 
    new DialogInterface.OnDismissListener() { 
     public void onDismiss(DialogInterface dialog) { 
      _logger.v("mOnDismissListener called"); 
      timeClear(); 
     } 
    }; 

Ho provato questo e funziona. In effetti, ho scoperto che OnDismissListener viene chiamato in entrambi gli scenari che hai menzionato, quando l'utente fa clic sul pulsante Annulla e quando colpisce il pulsante Indietro hardware. Quindi hai solo bisogno di questo unico gestore.

Infine, ora che so cosa google per, ho trovato this article che descrive la differenza tra un OnDismissListener ed un OnCancelListener, nella sezione "Utilizzo di Congeda ascoltatori":

+0

Questo non è quello che è stato chiesto - onDismiss viene attivato indipendentemente dal pulsante premuto, ma il manifesto vuole sapere quando è stato premuto il pulsante Annulla. Dichiara inoltre di aver già provato un ascoltatore onDismiss. – barry

+0

@barry buon punto .. Quello che trovo interessante è che "onCancelListener" non ha nulla a che fare con il pulsante Annulla nella finestra di dialogo DatePicker. Il commento di W00di è la risposta corretta ... quindi possibile duplicato. – giulio

4

L'unica soluzione, intuitive, è che è necessario per il pulsante Annulla "ignorare":

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

Ciò chiama anche il metodo OnTimeSet. Quindi in modo sequenziale chiama l'ascoltatore negativo quindi l'ascoltatore positivo. –

2

È possibile creare un booleana IsDataSet variabile ed in dateSetListener eseguire IsDataSet = true; e quindi collegare onDismissListener con un tale codice:

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

Ma non dimenticate di impostare IsDataSet = false ogni volta che si crea una finestra di dialogo.

0

La soluzione completa (testata e funzionante) consiste nel combinare OnDismissListener (vedere la risposta 3 di Kenneth Baltrinic sopra) insieme al booleano onDateSet descritto da dilix (1 risposta sopra). Avete bisogno di entrambi perché onDismiss viene utilizzato in tutti i casi: (1) l'utente ha selezionato i dati effettivi (2) l'utente ha annullato (3) l'utente ha premuto il pulsante indietro dell'hardware.

L'utilizzo della combinazione consente di distinguere tra di loro.

0

questa è la soluzione. può aiutare nessuno

datePickerDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "cancel", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      if (which == DialogInterface.BUTTON_NEGATIVE) { 
       // do something 
      } 
     } 
    }); 
Problemi correlati