onTouchListener anula un fondo personalizado en la vista de botón?

Tengo un button_animation.xml en mi carpeta res / drawable para mostrar diferentes estados de los botones (predeterminado, presionado, enfocado). Referencia button_animation.xml en un botón en mi archivo de disposición. Funciona perfectamente, excepto cuando pongo un onTouchListener en el botón que está siendo presionado. A continuación se muestra mi código.

button_animation.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/button_pressed" android:state_pressed="true" /> <item android:drawable="@drawable/button_focused" android:state_focused="true" /> <item android:drawable="@drawable/button_default" /> </selector> 

layout.xml

  <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/button_animation" /> 

Código que hace que la animación se rompa

 Button button = (Button) findViewById(R.id.button1); button.setOnTouchListener(this); 

¿No puedo mostrar el estado del botón como sugiere la documentación y manejarlo al mismo tiempo para una vista en particular?

Documentación: http://developer.android.com/guide/topics/ui/controls/button.html

Gracias,

Jason

Debe utilizar button.setOnClickListener (this) en lugar de button.setOnTouchListener (this) y la clase debe implementar OnClickListener.

Si todavía tiene que manejar onTouch (hacia abajo y hacia arriba), puede manejar la configuración de fondo usted mismo.

 public boolean onTouch( View button, MotionEvent theMotion ) { switch ( theMotion.getAction() ) { case MotionEvent.ACTION_DOWN: //Set button background here break; case MotionEvent.ACTION_UP: //set button to default background break; } return true; } 

Esta respuesta es bastante antigua, pero en caso de que alguien venga a buscar cómo hacer esto, aquí es cómo puede hacerlo. @Shadesblade estaba cerca, pero no completamente.

 public boolean onTouch(View button, MotionEvent theMotion) { switch (theMotion.getAction()) { case MotionEvent.ACTION_DOWN: button.setPressed(true); break; case MotionEvent.ACTION_UP: button.setPressed(false); break; } return true; } 

De esta manera puede utilizar un selector xml dibujable y aún alternar el estado con un listener de ontouch.

También asegúrese de que la vista "botón" es clicable (Clase del botón se puede hacer clic de forma predeterminada, pero si está usando algún otro punto de vista / viewgroup que hizo necesario para delcare esto en el xml).

Simplemente devuelva falso.

 public boolean onTouch(View view, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { } else if (event.getAction() == MotionEvent.ACTION_UP) { } return false; } 
  • Haciendo que un botón sea más fácil de hacer clic
  • En Android: ¿Cómo definir la animación adecuada para maximizar una vista mientras se minimizan otros 2 al mismo tiempo?
  • Android superponer una vista ontop de todo?
  • Vincular la vista personalizada de Android a una xml de diseño específico (¿es posible?)
  • Android: ¿Proporciona sugerencias de búsqueda recientes sin actividad de búsqueda?
  • ListView de filtros de búsqueda de Android
  • Uso de Javascript en la vista web
  • Android SurfaceView onDraw Pregunta
  • Android: mapa de bits de una vista de gran tamaño
  • addView no funciona
  • Filtro en vivo de la cámara Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.