Quando tento adicionar onTouchListner()
a um botão, consigo o
O botão setOnTouchListener foi chamado, mas não substitui performClick
Aviso. Alguém sabe como consertar isso?
btnleftclick.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return false;
}
});
Erro:
A exibição personalizada tem setOnTouchListener chamado, mas não substitui performClick Se uma exibição que substitui onTouchEvent ou usa um OnTouchListener também não implementa performClick e chama-o quando cliques são detectados, a exibição pode não lidar com as ações de acessibilidade adequadamente. O tratamento lógico das ações de clique deve ser colocado, idealmente, em Exibir # performClick, pois alguns serviços de acessibilidade chamam performClick quando uma ação de clique deve ocorrer.
ImageView
tem setOnTouchListener chamado, mas não substitui performClick Se uma exibição que substitui onTouchEvent ou usa um OnTouchListener também não implementa performClick e chama-o quando cliques são detectados, a exibição pode não lidar com as ações de acessibilidade adequadamente. O tratamento lógico das ações de clique deve ser colocado, idealmente, em Exibir # performClick, pois alguns serviços de acessibilidade chamam performClick quando uma ação de clique deve ocorrer.Respostas:
Este aviso surge porque o Android deseja lembrá-lo de pensar sobre os cegos ou deficientes visuais que podem estar usando seu aplicativo. Eu sugiro que você assista a este vídeo para uma rápida visão geral sobre como é.
As visualizações padrão da IU (como
Button
,TextView
etc.) são todas configuradas para fornecer aos usuários cegos um feedback apropriado por meio dos serviços de acessibilidade. Quando você tenta lidar com eventos de toque sozinho, corre o risco de esquecer de fornecer esse feedback. É para isso que serve o aviso.Opção 1: crie uma visualização personalizada
O tratamento de eventos de toque normalmente é feito em uma visualização personalizada. Não descarte essa opção muito rapidamente. Não é realmente tão difícil. Aqui está um exemplo completo de um
TextView
que é substituído para lidar com eventos de toque:Então você o usaria assim:
Veja minha outra resposta para mais detalhes sobre como fazer uma visualização personalizada.
Opção 2: silenciando o aviso
Outras vezes, pode ser melhor apenas silenciar o aviso. Por exemplo, não tenho certeza do que você deseja fazer com um para
Button
o qual precisa de eventos de toque. Se você fosse fazer um botão personalizado e chamadoperformClick()
emonTouchEvent
como eu fiz acima para o costumeTextView
, então ele iria ficar chamado duas vezes cada vez, porqueButton
já chamadasperformClick()
.Aqui estão alguns motivos pelos quais você pode querer apenas silenciar o aviso:
Adicione a seguinte linha ao início do método para suprimir o aviso:
Por exemplo:
fonte
MotionEvent event
objeto em seudoSomething()
método? Eu preciso verificarevent.getY()
.performClick()
. Meu pensamento inicial é se oevent.getY()
não é parte integrante do evento de clique real (ou seja, efeitos visuais de IU), mova essa lógica de volta paraonTouchEvent()
. Caso contrário, você poderia criar uma variável de membro de classe para armazenar oY
valor da última ação . Eu também sugiro que você verifique o código-fonte para algumas das visualizações padrão, então veja como o Android o implementa. Eu mesmo preciso estudá-los mais.onTouchEvent()
mas nãoperformClick()
. Isso pode incluir um toque ou clique ou qualquer outro evento de toque que você está tentando capturar.Solução:
Crie uma classe que estenda Button ou qualquer modo de exibição que você esteja usando e substitua performClick ()
Agora use este TouchableButton em xml e / ou código e o aviso desaparecerá!
fonte
android.widget.Button
está codificado, por isso não permite que você faça isso. E parece ser muito intencional da equipe de desenvolvimento do Android.Você já tentou adicionar:
ou adicionando a anotação suppresslint:
?
fonte
https://developer.android.com/guide/topics/ui/accessibility/custom-views#custom-touch-events
fonte