studio - El botón de Android ha establecido que SetOnTouchListener lo solicite, pero no anula la función de hacer clic
ontouchlistener android ejemplo (3)
cuando trato de agregar
ontouchListner
para un botón me da
El botón ha establecido que SetOnTouchListener lo haya llamado, pero no anula la función performClick
advertencia. Alguien sabe como arreglarlo. gracias..
btnleftclick.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return false;
}
});
error:
La vista personalizada ha establecido que OnOtListener lo solicitó, pero no anula el clic en 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. Lo ideal es que el manejo lógico de las acciones de clic se coloque en la Vista # performClick, ya que algunos servicios de accesibilidad invocan performClick cuando se produce una acción de clic.
¿Has intentado agregar:
view.performClick()
o agregando anotación suppresslint:
@SuppressLint("ClickableViewAccessibility")
?
Esta advertencia aparece 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 los comentarios apropiados 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 información.
Para eso es la advertencia.
Opción 1: crear una vista personalizada
El manejo de eventos táctiles es normalmente algo que se realiza en una vista personalizada.
No descarte esta opción demasiado rápido.
No es realmente tan difícil.
Aquí hay un ejemplo completo de un
TextView
que se
TextView
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 podría ser mejor simplemente silenciar la advertencia.
Por ejemplo, no estoy seguro de qué es lo que desea hacer con un
Button
que necesita eventos táctiles.
Si
performClick()
que hacer un botón personalizado y llamar a
performClick()
en
onTouchEvent
como hice anteriormente para el
TextView
personalizado, entonces se llamaría dos veces cada vez porque
Button
ya llama a
performClick()
.
Aquí hay un par de razones por las que es posible que desee 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.
- Eres insensible 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 comienzo 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;
}
});
}
Solución:
-
Cree una clase que extienda Button o cualquier vista que esté utilizando y anule performClick ()
class TouchableButton extends Button { @Override public boolean performClick() { // do what you want return true; } }
-
¡Ahora use este TouchableButton en xml y / o código y la advertencia desaparecerá!