Esta advertencia surge porque Android quiere recordarle que piense en las personas ciegas o con discapacidad visual que pueden estar usando su aplicación. Le sugiero que vea este video para obtener una descripción general rápida de cómo es eso.
Las vistas estándar de la interfaz de usuario (como Button
, TextView
etc.) están configuradas para proporcionar a los usuarios ciegos la retroalimentación adecuada a través de los servicios de accesibilidad. Cuando intenta manejar los eventos táctiles usted mismo, corre el peligro de olvidarse de proporcionar esa retroalimentación. Para eso es la advertencia.
Opción 1: crear una vista personalizada
El manejo de eventos táctiles suele ser algo que se realiza en una vista personalizada. No descarte esta opción demasiado rápido. No es tan difícil. A continuación, se muestra un ejemplo completo de TextView
que se anula para manejar eventos táctiles:
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();
}
}
Entonces lo usarías así:
<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"/>
Consulte mi otra respuesta para obtener más detalles sobre cómo crear una vista personalizada.
Opción 2: silenciar la advertencia
Otras veces puede ser mejor simplemente silenciar la advertencia. Por ejemplo, no estoy seguro de qué es lo que desea hacer con un Button
evento táctil para el que necesita. Si se va a hacer un botón personalizado y llamado performClick()
en onTouchEvent
como lo hice anteriormente para el encargo TextView
, entonces sería conseguir llamó dos veces cada vez porque Button
ya se llama performClick()
.
Aquí hay un par de razones por las que podría querer silenciar la advertencia:
- El trabajo que está realizando con su evento táctil es solo visual. No afecta el funcionamiento real de su aplicación.
- Tienes un corazón frío y no te importa hacer del mundo un lugar mejor para las personas ciegas.
- Eres demasiado vago para copiar y pegar el código que te di en la Opción 1 anterior.
Agregue la siguiente línea al principio del método para suprimir la advertencia:
@SuppressLint("ClickableViewAccessibility")
Por ejemplo:
@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
ha llamado a setOnTouchListener pero no anula performClick Si una vista que anula onTouchEvent o usa un OnTouchListener no implementa también performClick y lo llama cuando se detectan clics, es posible que la vista no maneje las acciones de accesibilidad correctamente. La lógica que maneja las acciones de clic debe ubicarse idealmente en Ver # performClick ya que algunos servicios de accesibilidad invocan performClick cuando debe ocurrir una acción de clic.