Android: por que o clique longo também aciona um clique normal?


126

Eu tenho um ListView com ouvintes por um longo clique e um clique regular.

Por que, quando pressiono um item da lista, o evento de clique regular também é chamado?

Eu preciso ter duas funções separadas para os diferentes cliques.

Respostas:


284

Dos ouvintes do evento :

onLongClick () - retorna um booleano para indicar se você consumiu o evento e não deve ser levado adiante. Ou seja, retorne true para indicar que você manipulou o evento e ele deve parar aqui; retorne false se você não o tiver manipulado e / ou o evento continuar com outros ouvintes ao clicar.

Você está voltando truedo seu onLongClick()evento e continua recebendo o clique normal?

Editado para adicionar : para um ListView, você pode estar usando OnItemLongClickListener. O onItemLongClick()lá usa um valor de retorno booleano semelhante para indicar se consumiu o evento.


1
Para definir a myListView.setOnItemLongClickListener(this); opção, você precisará Substituir a função public boolean onItemLongClick(...). Aqui você precisa simplesmente o return trueque indica que o LongClick foi ativado e cancelará o gatilho com um clique regular. Se você retornar falso, também acionará o clique regular.
Brandon

o que acontece com a outra situação, quando eu preciso diferem entre o longo clique e clique normal a agir de acordo com isso
Muhammed Refaat

@erichamion Tentei sua solução para um problema semelhante, sem sorte. Gostaria muito de receber informações ou pensamentos que você possa fornecer, localizado aqui: stackoverflow.com/questions/47783631/…
AJW

49

Reafirmando a resposta em termos mais simples:

Dado:

@Override
public boolean onLongClick(View view) {

    return true; // or false
}
  • return truesignifica que o evento é consumido. É tratado. Nenhum outro evento de clique será notificado.
  • return falsesignifica que o evento não é consumido. Quaisquer outros eventos de clique continuarão recebendo notificações.

Portanto, se você não quiser onClicktambém ser acionado após um onLongClick, deverá fazê- lo a return truepartir do onLongClickevento.


2
Resposta Super perfeito se colocarmos verdadeiro valor, em seguida, apenas lidar com longa clique se colocarmos falsa então ambos clique e longo evento de imprensa ocorrer de uma só vez
Pir Fahim Shah

Excelente resposta.
Sam Chen

20

Verifique se você está substituindo o OnClickListenerseu onClickmétodo. Verifique também se você está substituindo o OnLongClickListenerseu onLongClickmétodo. E certifique-se de que seu onLongClickmétodo retorne true, pois isso consumirá o onClick.


Eu adicionei true no meu método onLongClick, mas ainda tenho um problema em que meu método onClick não é acionado posteriormente. Gostaria de receber quaisquer pensamentos ou idéias sobre como resolver, localizado aqui: stackoverflow.com/questions/47783631/…
AJW

0

Você pode implementar a setOnLongClickListenercriação de uma instância de new View.OnClickListener()ou new View.OnLongClickListener(), se você criar um clique longo e implementar um OnclickListener normal, obterá esses erros de clique único ativando o método. Você deve usar new View.OnLongClickListener()para capturar apenas cliques longos

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.