Android RelativeLayout选择器状态';行不通

Android RelativeLayout选择器状态';行不通,android,android-relativelayout,Android,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_

我有这样的
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>
如你所见,我有3个图像:默认情况下,选中并按下

但是我有一个问题:只有默认的和所选的
状态
图像可以按预期工作,但是按下的
状态
似乎不工作。

我有几个上面提到的
相对值
,没有人使用
状态_pressed

有人知道我的问题在哪里吗


谢谢

尝试添加到您的ImageView android:clickable=“true”

在我看来,您应该使用
按钮
并为其创建选择器,而不是通过创建
相对视图
并将
图像视图
文本视图
来创建自定义按钮。
然后您可以使用android:drawableTop=“@drawable/your_contact_icon”。之后,您可以检查选择器是否工作正常。

确保您的RelativeLayout可单击

您还可以在
RelativeLayout中设置
android:addStatesFromChildren=“true”
,而不是
android:clickable=“true”
。如果您的孩子已经可点击、可聚焦等,您不应该让您的
相对性成为可点击或可聚焦的。

希望这些可以帮助别人

  • 确保视图可单击。子体可以阻止单击事件。更多信息请搜索以下属性
  • android:clickable,android:DegenantFocusability,android:Focusability,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

    在每次状态更改期间,状态列表都会从上到下遍历 与当前状态匹配的第一项将用于 选择不是基于“最佳匹配”,而只是第一项 符合该州的最低标准

    州名单

    好吧,使用RelativeLayout,我可以更改文本,而不将其放入图像中。@MaximShoustin Ok,非常好;)我已经在RelativeLayout中添加了android:clickable=“true”,然后在RelativeLayout上的任何地方单击都会导致内部视图的stateListener执行操作!!!它正在使用
    Relativelayout
    包含
    TextView
    ImageView
    Relativelayout,因为我需要将选择器应用于Rl BG。现在,它为您脱帽致敬,感谢您拯救我的生命:)您是对的,如果您的子视图已经注册了单击侦听器,那么您需要添加addStatesFromChildren=“true”与clickable=“true”一起,让选择器在父布局上工作。感谢您解释“android:state\u pressed=“false”如何使顺序变得不重要。
    
    <?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>