2011-01-09 8 views
27

C'è un modo per rimuovere un listener da un View in Android? Ho un Checkbox che ho allegato un CheckChangedListener a. Il problema è che chiamare setChecked() provoca l'attivazione del mio ascoltatore.Rimuovere un listener da una vista in Android

Se non riesco a rimuovere un listener, esiste un modo per impedire l'ascolto del listener quando chiamo setChecked() manualmente rispetto a quando viene controllato da un evento di tocco?

risposta

59

Bene, ho trovato la risposta. Questo non sembra essere documentato da nessuna parte, ma ho passato il codice per la classe View e se si passa null ai metodi setClickListener, si rimuoverà il listener.

checkbox.setOnCheckChangedListener(null); 

Questo dovrebbe funzionare per qualsiasi listener di eventi.

+1

ID essere cauti sull'utilizzo di funzionalità non documentate, possono cambiare in qualsiasi momento. –

+4

Non definirei esattamente questa "funzione non documentata". Se una vista supporta un singolo listener di un determinato tipo e si imposta quel listener su null, cos'altro ci si aspetta che accada? :) – adamp

+3

Non è una funzionalità non documentata. È solo non documentato che è sicuro passare in null, che è. Il listener interno utilizzato da view inizia come null sulla costruzione e viene confrontato con null quando si determina se inviare l'evento. L'impostazione di null la reimposta sul valore che ha prima di impostare un listener. – Falmarri

2

Si potrebbe provare a impostare l'ascoltatore su uno che non fa nulla prima di chiamare setChecked() e quindi restituire quello utile in seguito.

5

Perché hai un checkChangeListener? Se dovessi usare uno onClicklListener, potrebbe funzionare solo per te?

-4

Basta usare removeListener (questo). Mi sto perdendo qualcosa qui?

+6

La classe View non ha un metodo "removeListener" ... – Falmarri

0

Ho avuto problemi simili con la vista Spinner. La mia soluzione era di creare una variabile membro della classe che controllo nel metodo OnItemSelected. Prima di cambiare il contenuto/selezione dello Spinner in modo programmatico, imposta questa variabile su true. Quando viene attivato OnItemSelected, se la variabile è true, la modifica in false e solo return senza eseguire alcun lavoro. Il lato negativo di questo è che rende difficile la risoluzione dei problemi poiché questa variabile viene impostata su tutto il mio codice.

Problemi correlati