Состояние селектора Android RelativeLayout не работает
Я 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>
и кажется:
мой 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, похоже, не работает.
у меня есть несколько вышеупомянутых RelativeLayouts
и никто не работает с state_pressed
.
кто-нибудь знает, где моя проблема?
спасибо!
5 ответов
вы также можете установить android:addStatesFromChildren="true"
в своем RelativeLayout
вместо android:clickeable="true"
. Если ваши дети уже clickeable, то focusable, etc. Вы не должны делать свой RelativeLayout
clickeable или focusable.
на мой взгляд вы должны использовать Button
и создать селектор для него вместо создания пользовательской кнопки, создав RelativeLayout
и ставишь там ImageView
и TextView
.
Тогда вы можете использовать android:drawableTop="@drawable/your_contact_icon"
. После этого вы можете проверить, работает ли ваш селектор нормально.
надеюсь, это поможет кому-то;
- убедитесь, что смотреть кликабельны. потомки могут блокировать событие click. подробнее поиск атрибутов ниже.
android: clickable, android: descendantFocusability, android: focusable, android: focusableInTouchMode
-
в стиле 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>
Ref;
во время каждого изменения состояния список состояний проходит сверху вниз и используется первый элемент, который соответствует текущему состоянию- выбор не основан на "лучшем совпадении", а просто на первом элементе что соответствует минимальным критериям
Государственный Список https://developer.android.com/guide/topics/resources/drawable-resource.html