Я хочу создать кнопку с текстом и изображением, где текст и изображение меняются, когда кнопка находится в нажатом состоянии. Все остальные вопросы о кнопках и изображениях касались изменения фона в нажатом состоянии, но никто не прокомментировал изменение изображения, которое можно вырезать на переднем плане.
Как изменить отображаемое изображение на кнопке с текстом, чтобы отразить нажатое состояние в 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, и его нажатое состояние будет передано по иерархии.