Android RelativeLayout Selector state_pressed не работает

У меня RelativeLayout как это:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:id="@+id/contacts"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_weight="0.2"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<ImageView
    android:id="@+id/image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:contentDescription="@string/content_description_contacts"
    android:scaleType="fitXY"
    android:src="@drawable/contacts" />

<TextView
    android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_alignBottom="@id/image"
    android:paddingBottom="10dp"
    android:textColor="@drawable/text_color"
    android:text="@string/button_contacts"
    android:textSize="12sp" />    
</RelativeLayout>

enter image description here

и выглядит следующим образом:

enter image description here

Мой contacts Селектор выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" 
    android:drawable="@drawable/contacts_over" />
<item android:state_selected="true"
    android:drawable="@drawable/contacts_selected" />
<item
     android:drawable="@drawable/contacts_default" />
</selector>

Как видите, у меня есть 3 изображения: по умолчанию выбрано и нажато.

Но у меня есть проблема: только по умолчанию и state_selected изображения работают, как ожидалось, но state_pressed dosn't, похоже, работает.

У меня есть несколько вышеупомянутых RelativeLayouts, и никто не работает с state_pressed.

Кто-нибудь знает, где моя проблема?

Спасибо!

Ответы

Ответ 1

убедитесь, что ваш RelativeLayout доступен для клика

Ответ 2

Попробуйте добавить к вашему ImageView андроид: clickable = "true"

Ответ 3

Вы также можете установить android:addStatesFromChildren="true" в RelativeLayout вместо android:clickeable="true". Если ваши дети уже являются клики, фокусируемыми и т.д. Вы не должны делать ваш RelativeLayout доступным для клика или фокусируемым.

Ответ 4

По-моему, вы должны использовать Button и создать селектор для него вместо создания пользовательской кнопки, создав RelativeLayout и разместив там ImageView и TextView. Затем вы можете использовать android:drawableTop="@drawable/your_contact_icon". После этого вы можете проверить, работает ли ваш селектор.

Ответ 5

надеюсь, что это кому-то поможет;

  • убедитесь, что просмотр доступен. потомки могут блокировать событие click. подробнее поиск ниже атрибутов.

android: clickable, android: descendantFocusability, android: focusable, android: focusableInTouchMode

  1. в стиле xml вы должны определить атрибуты состояния элемента элемента или убедиться, что элемент без атрибута должен быть в конце.

    <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape>
            <solid android:color="@color/lightGold"/>
            <stroke android:width="1dp" android:color="@color/lightGrey"/>
            <padding android:bottom="@dimen/padding1" android:left="@dimen/padding1" android:right="@dimen/padding1" android:top="@dimen/padding1"/>
        </shape>
    </item>
    <item>
        <shape>
            <solid android:color="@color/white_two"/>
            <stroke android:width="1dp" android:color="@color/lightGrey"/>
            <padding android:bottom="@dimen/padding1" android:left="@dimen/padding1" android:right="@dimen/padding1" android:top="@dimen/padding1"/>
        </shape>
    </item>
    

Но этот образец не будет работать;

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape>
        <solid android:color="@color/white_two"/>
        <stroke android:width="1dp" android:color="@color/lightGrey"/>
        <padding android:bottom="@dimen/padding1" android:left="@dimen/padding1" android:right="@dimen/padding1" android:top="@dimen/padding1"/>
    </shape>
</item>
<item android:state_pressed="true">
    <shape>
        <solid android:color="@color/lightGold"/>
        <stroke android:width="1dp" android:color="@color/lightGrey"/>
        <padding android:bottom="@dimen/padding1" android:left="@dimen/padding1" android:right="@dimen/padding1" android:top="@dimen/padding1"/>
    </shape>
</item>

или вы можете определить атрибут состояния для обоих элементов. Поэтому порядок не будет иметь значения.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="false">
        <shape>
            <solid android:color="@color/white_two"/>
            <stroke android:width="1dp" android:color="@color/lightGrey"/>
            <padding android:bottom="@dimen/padding1" android:left="@dimen/padding1" android:right="@dimen/padding1" android:top="@dimen/padding1"/>
        </shape>
    </item>
    <item android:state_pressed="true">
        <shape>
            <solid android:color="@color/lightGold"/>
            <stroke android:width="1dp" android:color="@color/lightGrey"/>
            <padding android:bottom="@dimen/padding1" android:left="@dimen/padding1" android:right="@dimen/padding1" android:top="@dimen/padding1"/>
        </shape>
    </item>
</selector>

Ссылка

При каждом изменении состояния список состояний перемещается сверху вниз и используется первый элемент, который соответствует текущему состоянию. выбор не основан на "наилучшем совпадении", а просто на первом элементе который соответствует минимальным критериям состояния

Список состояний https://developer.android.com/guide/topics/resources/drawable-resource.html