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:
public class CustomTextView extends AppCompatTextView {
public CustomTextView(Context context) {
super(context);
}
public CustomTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
return true;
case MotionEvent.ACTION_UP:
performClick();
return true;
}
return false;
}
// Because we call this from onTouchEvent, this code will be executed for both
// normal touch events and for when the system calls this using Accessibility
@Override
public boolean performClick() {
super.performClick();
doSomething();
return true;
}
private void doSomething() {
Toast.makeText(getContext(), "did something", Toast.LENGTH_SHORT).show();
}
}
Então você o usaria assim:
<com.example.myapp.CustomTextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="20dp"
android:text="Click me to do something"/>
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 chamado performClick()
em onTouchEvent
como eu fiz acima para o costume TextView
, então ele iria ficar chamado duas vezes cada vez, porque Button
já chamadasperformClick()
.
Aqui estão alguns motivos pelos quais você pode querer apenas silenciar o aviso:
- O trabalho que você está realizando com seu evento de toque é apenas visual. Isso não afeta o funcionamento real do seu aplicativo.
- Você tem o coração frio e não se importa em tornar o mundo um lugar melhor para os cegos.
- Você está com preguiça de copiar e colar o código que forneci na Opção 1 acima.
Adicione a seguinte linha ao início do método para suprimir o aviso:
@SuppressLint("ClickableViewAccessibility")
Por exemplo:
@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button myButton = findViewById(R.id.my_button);
myButton.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return false;
}
});
}
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.