Как изменить отображаемое изображение на кнопке с текстом, чтобы отразить нажатое состояние в XML?

Я хочу создать кнопку с текстом и изображением, где текст и изображение меняются, когда кнопка находится в нажатом состоянии. Все остальные вопросы о кнопках и изображениях касались изменения фона в нажатом состоянии, но никто не прокомментировал изменение изображения, которое можно вырезать на переднем плане.

Ответ 1

Вам нужен селектор состояний как для цвета текста кнопки, так и для изображения, используемого в качестве переносимого.

Вот как вы это делаете:

Макет/my_layout.xml:

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/bottom_action_delete"
    android:drawableLeft="@drawable/test_button_drawable"
    android:textColor="@color/link_text_red"
    android:text="Test Button"
    android:onClick="buttonDelete" />

drawable/test_button_drawable.xml: (bottom_action_delete_image и bottom_action_delete_image_pressed являются PNG в drawable-hdpi/)

<?xml version="1.0" encoding="utf-8"?>
<selector
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:dither="true" >
    <item
        android:state_window_focused="false"
        android:drawable="@drawable/bottom_action_delete_image" />
    <item
        android:state_pressed="true"
        android:drawable="@drawable/bottom_action_delete_image_pressed" />
    <item
        android:state_focused="true"
        android:drawable="@drawable/bottom_action_delete_image_pressed" />
    <item
        android:drawable="@drawable/bottom_action_delete_image" />
    </selector>

color/link_text_red.xml: (link_text_focused_red_v2, link_text_pressed_red_v2 и link_text_red_v2 определены в значениях /colors.xml)

<?xml version="1.0" encoding="utf-8"?>
<selector
    xmlns:android="http://schemas.android.com/apk/res/android" >
<item
    android:color="@color/link_text_red_v2"
    android:state_window_focused="false" />
    <item
        android:color="@color/link_text_focused_red_v2"
        android:state_focused="true"/>
    <item
        android:color="@color/link_text_pressed_red_v2"
        android:state_pressed="true"/>
    <item
        android:color="@color/link_text_red_v2" />
</selector>

Если вам нужно что-то еще более сложное, вы можете использовать атрибут android:duplicateParentState="true" в элементах дочернего макета Button, и его нажатое состояние будет передано по иерархии.