Cuando trato de agregar onTouchListner()
a un botón, me da la
Button ha llamado a setOnTouchListener pero no anula performClick
advertencia. ¿Alguien sabe cómo arreglarlo?
btnleftclick.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return false;
}
});
Error:
La vista personalizada ha llamado 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.
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.Respuestas:
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:Entonces lo usarías así:
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 llamadoperformClick()
enonTouchEvent
como lo hice anteriormente para el encargoTextView
, entonces sería conseguir llamó dos veces cada vez porqueButton
ya se llamaperformClick()
.Aquí hay un par de razones por las que podría querer silenciar la advertencia:
Agregue la siguiente línea al principio del método para suprimir la advertencia:
Por ejemplo:
fuente
MotionEvent event
objeto en tudoSomething()
método? Necesito comprobarevent.getY()
.performClick()
. Mi pensamiento inicial es que sievent.getY()
no es parte integral del evento de clic real (es decir, efectos visuales de la interfaz de usuario), entonces mueva esa lógica de regreso aonTouchEvent()
. De lo contrario, podría crear una variable miembro de clase para almacenar elY
valor de la última acción . También te sugiero que consultes el código fuente para ver algunas de las vistas estándar para ver cómo lo implementa Android. Necesito estudiarlos más yo mismo.onTouchEvent()
pero noperformClick()
. Eso podría incluir un deslizamiento o un clic o cualquier otro evento táctil que esté tratando de capturar.Solución:
Cree una clase que amplíe Button o cualquier vista que esté usando y anule performClick ()
¡Ahora use este TouchableButton en xml y / o código y la advertencia desaparecerá!
fuente
android.widget.Button
está codificado por lo que no le permite hacer esto. Y parece ser muy intencional por parte del equipo de desarrollo de Android.¿Ha intentado agregar:
o agregando la anotación suppresslint:
?
fuente
https://developer.android.com/guide/topics/ui/accessibility/custom-views#custom-touch-events
fuente