Remover um ouvinte ao clicar

194

Eu tenho um objeto em que o texto alterna e exibe mensagens de status. Quando as mensagens mudam, desejo que o evento click do objeto seja alterado para levá-lo à atividade à qual a mensagem está relacionada.

Então, eu tenho um TextView mTitleViewe estou atribuindo o evento assim.

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

Como faço para remover esse evento de clique? Existem algumas mensagens de status que não têm uma área acionável, então eu gostaria de desativar o evento de clique. Também gostaria de poder percorrer esses eventos de clique e descartá-los adequadamente, mas não tenho certeza das melhores práticas.

Josh
fonte

Respostas:

416

mTitleView.setOnClickListener(null) deve fazer o truque.

Um design melhor pode ser o de verificar o status do OnClickListener e, em seguida, determinar se o clique deve ou não fazer alguma coisa versus adicionar e limpar ouvintes de clique.

Robby Pond
fonte
1
Não há nenhuma outra limpeza que eu tenha que fazer para cancelar o registro do evento?
21411 Josh
2
Não. O ouvinte é apenas um objeto que a exibição usa para chamar um método quando você clica em algo. Quando você o define como nulo, ele o destrói.
precisa
15
Será que os ouvintes causam alocação de memória? Precisamos libertá-los? Isso aumentará o desempenho do aplicativo?
Alicanbatur #
2
Obrigado pela sua resposta, lembre-se de adicionar por que você acha melhor verificar o status ou uma bandeira no ouvinte.
kapv89
2
Quando você diz que a better designestá implicando implicações no desempenho ou está apenas dizendo que é um pouco desagradável?
RTF
132

Observe que, se uma visualização não for clicável (um TextView, por exemplo), a configuração setOnClickListener(null)significará que a visualização é clicável. Use mMyView.setClickable(false)se você não quiser que sua visualização seja clicável. Por exemplo, se você usar um extraível xml para o plano de fundo, que mostra cores diferentes para estados diferentes, se a visualização ainda for clicável, os usuários poderão clicar nele e a cor diferente do plano de fundo será exibida, o que pode parecer estranho.

Roda livre
fonte
É bom saber para o TextView e tal, mas para um ListView não tem efeito quando um OnClickListener foi definido anteriormente.
Alguém em algum lugar
4
É por isso que escrevi "Observe que se uma exibição não é clicável (um TextView, por exemplo)" - um ListView é clicável e, portanto, não funciona.
precisa
Se precisarmos alternar para desativar / ativar o onClickListener do View, na minha opinião, esta é a melhor solução do que definir setOnClickListener (null).
Panini Luncher
1
view.setOnClickListener (null) junto com view.setClickable (false) é a resposta correta, obrigado !!!!
Petros Mastrantonas
12

Talvez setOnClickListener(null)?

Lutero
fonte
1
Isso não funciona especificamente para caixas de seleção e provavelmente também não funcionará para outros widgets.
Chris
8

Configuração setOnClickListener(null) é uma boa idéia para remover o ouvinte de clique em tempo de execução.

E também alguém comentou que ligar View.hasOnClickListeners()depois disso retornará true, NÃO meu amigo.

Aqui está a implementação de hasOnClickListeners()tirada da android.view.Viewclasse

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

Graças a Deus. Ele verifica se hánull .

Então, tudo está seguro. Aproveitar :-)

Azim Ansari
fonte
4

As respostas acima parecem instáveis ​​e não confiáveis. Tentei fazer isso com um ImageView em um layout relativo simples e ele não desativou o evento onClick.

O que funcionou para mim foi usar o setEnabled.

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

Você pode então verificar se a Visualização está ativada com:

boolean ImageView.isEnabled();

Outra opção é usar setContentDescription (String string) e String getContentDescription () para determinar o status de uma exibição.

Brandon Thompson
fonte
4

Basta colocar, funcionou para mim

itemView.setOnClickListener(null);
Sai Gopi N
fonte
3
    /**
 * Remove an onclick listener
 *
 * @param view
 * @author [email protected]
 * @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();
        }

    }
}
androidmalin
fonte
0

Apenas reinicializar o item como abaixo faria o truque. Ele removeria onclick, onlonglick, onitemclick, onitemlongclick com base no item

mTitleView = findViewById (R.id.mTitleView);

Rockit Rockit
fonte