Rimuovi un listener onclick


194

Ho un oggetto in cui il testo scorre e visualizza i messaggi di stato. Quando i messaggi cambiano, voglio che l'evento click dell'oggetto cambi per portarti all'attività a cui si riferisce il messaggio.

Quindi, ho un TextView mTitleViewe sto assegnando l'evento in questo modo.

public void setOnTitleClickListener(OnClickListener listener) {
    mTitleView.setOnClickListener(listener);
}

Come rimuovo quell'evento click? Ci sono alcuni messaggi di stato che non hanno un'area utilizzabile, quindi vorrei disattivare l'evento click. Vorrei anche essere in grado di scorrere tra questi eventi di clic e di eliminarli correttamente, ma non sono sicuro delle migliori pratiche.

Risposte:


416

mTitleView.setOnClickListener(null) dovrebbe fare il trucco.

Una progettazione migliore potrebbe essere quella di fare un controllo dello stato in OnClickListener e quindi determinare se il clic dovrebbe fare qualcosa o aggiungere e cancellare listener di clic.


1
Non c'è altra pulizia che devo fare per annullare la registrazione dell'evento?
Josh

2
No. Il listener è solo un oggetto che la vista utilizza per chiamare un metodo quando si fa clic, quindi quando lo si imposta su null lo distrugge.
Robby Pond

15
mi chiedo se gli ascoltatori causino l'allocazione di memoria? Dobbiamo liberarli? Ciò aumenterà le prestazioni dell'app?
alicanbatur,

2
Grazie per la risposta, ricorda di aggiungere perché pensi che sia meglio controllare lo stato o un flag nell'ascoltatore.
kapv89,

2
Quando dici che a better designstai implicando implicazioni sulle prestazioni o stai solo dicendo che è un po 'sgradevole?
RTF

132

Notare che se una vista non è selezionabile (ad esempio una TextView), l'impostazione setOnClickListener(null)indica che è possibile fare clic sulla vista. Utilizzare mMyView.setClickable(false)se non si desidera che la vista sia selezionabile. Ad esempio, se si utilizza un disegno XML per lo sfondo, che mostra colori diversi per stati diversi, se la vista è ancora selezionabile, gli utenti possono fare clic su di essa e verrà visualizzato il colore di sfondo diverso, che può apparire strano.


Questo è utile sapere per TextView e simili, ma per ListView non ha alcun effetto quando in precedenza era stato impostato un OnClickListener.
Someone Somewhere

4
Questo è il motivo per cui ho scritto "Nota che se una vista non è cliccabile (ad esempio un TextView)" - un ListView è cliccabile e quindi non funziona per questo.
FreewheelNat

Se dobbiamo passare avanti e indietro per disabilitare / abilitare onClickListener di View, a mio avviso, questa è la soluzione migliore rispetto all'impostazione setOnClickListener (null).
Panini Luncher,

1
view.setOnClickListener (null) insieme a view.setClickable (false) è la risposta corretta, grazie !!!!
Petros Mastrantonas,

12

Forse setOnClickListener(null)?


1
Questo non funziona specificamente per le caselle di controllo e probabilmente non funzionerà anche per altri widget.
Chris,

8

L'impostazione setOnClickListener(null)è una buona idea per rimuovere l'ascoltatore di clic in fase di esecuzione.

E anche qualcuno ha commentato che la chiamata View.hasOnClickListeners()dopo tornerà true, NO amico mio.

Ecco l'implementazione di hasOnClickListeners()presa dalla android.view.Viewclasse

 public boolean hasOnClickListeners() {
        ListenerInfo li = mListenerInfo;
        return (li != null && li.mOnClickListener != null);
    }

Grazie Dio. Controlla null.

Quindi tutto è sicuro. Godere :-)


4

Le risposte sopra sembrano volubili e inaffidabili. Ho provato a farlo con un ImageView in un semplice layout relativo e non ha disabilitato l'evento onClick.

Quello che ha funzionato per me è stato usare setEnabled.

ImageView v = (ImageView)findViewByID(R.id.layoutV);
v.setEnabled(false);

È quindi possibile verificare se la vista è abilitata con:

boolean ImageView.isEnabled();

Un'altra opzione è utilizzare setContentDescription (String string) e String getContentDescription () per determinare lo stato di una vista.


4

In poche parole, ha funzionato per me

itemView.setOnClickListener(null);

3
    /**
 * Remove an onclick listener
 *
 * @param view
 * @author malin.myemail@gmail.com
 * @website https://github.com/androidmalin
 * @data 2016-05-16
 */
public static void unBingListener(View view) {
    if (view != null) {
        try {
            if (view.hasOnClickListeners()) {
                view.setOnClickListener(null);

            }

            if (view.getOnFocusChangeListener() != null) {
                view.setOnFocusChangeListener(null);

            }

            if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
                ViewGroup viewGroup = (ViewGroup) view;
                int viewGroupChildCount = viewGroup.getChildCount();
                for (int i = 0; i < viewGroupChildCount; i++) {
                    unBingListener(viewGroup.getChildAt(i));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

0

Reinizializzare semplicemente l'oggetto come di seguito farebbe il trucco. Rimuove onclick, onlonglick, onitemclick, onitemlongclick in base all'elemento

mTitleView = findViewById (R.id.mTitleView);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.