OnTouchListener переопределяет пользовательский фон при просмотре кнопок?

У меня есть button_animation.xml в папке res / drawable для отображения различных состояний кнопок (по умолчанию, нажата, сфокусирована). Я ссылаюсь на button_animation.xml на кнопку в моем файле макета. Он отлично работает, за исключением случаев, когда я устанавливаю onTouchListener на кнопку, которая на самом деле нажата. Ниже мой код.

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" /> 

Код, который приводит к разрыву анимации

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

Я не могу показать состояние кнопки, как предлагает документация, и обрабатывать onClick одновременно для любого конкретного вида?

Документация: http://developer.android.com/guide/topics/ui/controls/button.html

Благодаря,

Джейсон

Вы должны использовать button.setOnClickListener (this) вместо button.setOnTouchListener (this), и класс должен реализовать OnClickListener.

Если вам по-прежнему нужно обрабатывать onTouch (вниз и вверх), вы можете самостоятельно отрегулировать настройку фона.

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

Этот ответ довольно старый, но на всякий случай кто-то ищет, как это сделать, вот как вы можете это сделать. @Shadesblade был близок, но не совсем там.

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

Таким образом, вы можете использовать xml-селектор, который можно вытащить и по-прежнему переключать состояние с помощью ontouchlistener.

Также убедитесь, что кнопка «просмотр» нажата (класс кнопки по умолчанию доступен по клику, но если вы используете какую-либо другую группу просмотра / просмотра, которую вам нужно было обработать в xml).

Просто верните false.

 public boolean onTouch(View view, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { } else if (event.getAction() == MotionEvent.ACTION_UP) { } return false; }