tutorial studio ontouchdown event ejemplo action_outside android ontouchlistener

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:

  1. 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; } }

  2. ¡Ahora use este TouchableButton en xml y / o código y la advertencia desaparecerá!