Tengo un gráfico de botones que necesita tener la función de "mantener presionado", así que en lugar de usar onClickListener, estoy usando onTouchListener de manera que la aplicación pueda reaccionar aEl botón "Mantener presionado" en Android necesita cambiar los estados (selector XML personalizado) usando onTouchListener
MotionEvent.ACTION_DOWN,
y
MotionEvent.ACTION_UP
Dependiendo de la rapidez con que se activan estos dos eventos, que se puede ejecutar un "pressAndHoldHandler" en el tiempo entre los dos.
De todos modos, cuento largo: Tengo numerosos botones "básicos" en la misma aplicación que no requieren la función de presionar y mantener, por lo que están usando onClickListener.
Cada uno de estos botones se han personalizado gráficamente con su propio archivo XML de selección:
<?xml version="1.0" encoding="UTF-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_enabled="false"
android:drawable="@drawable/btn_chicken_off" />
<item
android:state_enabled="true"
android:state_pressed="true"
android:drawable="@drawable/btn_chicken_s3" />
<item
android:state_enabled="true"
android:state_focused="true"
android:drawable="@drawable/btn_chicken_s2" />
<item
android:state_enabled="true"
android:drawable="@drawable/btn_chicken_off" />
</selector>
Por lo tanto, el problema aquí es: El selector anterior no consigue acceder con el onTouchListener. Solo onClickListener obtendrá los cambios de estado con la sección onClick() de su propio método, por lo que estos botones "presionar y mantener" nunca cambian de estado. Comentarios bastante terribles para el usuario.
estoy forzando actualmente lo anterior dentro de la caja del interruptor de ACTION_DOWN y ACTION_UP de la siguiente manera:
if (action == MotionEvent.ACTION_DOWN) {
btn_chicken.setBackgroundResource(R.drawable.btn_chicken_s3);
}
else
if (action == MotionEvent.ACTION_UP) {
btn_chicken.setBackgroundResource(R.drawable.btn_chicken_off);
}
Pero parece como un corte, y le falta la etapa de "centrado pero no presionado".
¿Alguien ha tropezado con esto antes?
Esto era exactamente mi problema. Gracias por la buena descripción. – Suragch