【问题标题】:Android RelativeLayout Selector state_pressed doesn't workAndroid RelativeLayout 选择器 state_pressed 不起作用
【发布时间】:2013-04-23 08:06:06
【问题描述】:

我有这样的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 似乎不起作用。

我有几个上面提到的RelativeLayouts,没有人使用state_pressed

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

谢谢!

【问题讨论】:

    标签: android android-relativelayout


    【解决方案1】:

    确保您的 RelativeLayout 是可点击的

    【讨论】:

    • 我已将 android:clickable="true" 添加到RelativeLayout,然后在RelativeLayout 上的任何地方单击都会导致内部视图的stateListener 起作用!!!
    • 它与包含 TextViewImageViewRelativelayout 一起使用,因为我需要将选择器应用于 Rl Bg
    • 现在工作——为你脱帽致敬
    • 谢谢你救了我的命 :)
    【解决方案2】:

    您也可以在RelativeLayout 中设置android:addStatesFromChildren="true",而不是android:clickeable="true"。如果您的孩子已经可点击、可聚焦等。您不应该让您的RelativeLayout 可点击或可聚焦。

    【讨论】:

    • 你是对的,如果你有已经注册了 Click Listeners 的子视图,那么你需要添加 addStatesFromChildren="true" 和 clickable="true" 来让选择器在父布局上工作。
    【解决方案3】:

    尝试添加到你的 ImageView android:clickable="true"

    【讨论】:

      【解决方案4】:

      在我看来,您应该使用Button 并为其创建选择器,而不是通过创建RelativeLayout 并放置ImageViewTextView 来制作自定义按钮。 然后你可以使用android:drawableTop="@drawable/your_contact_icon"。之后您可以检查您的选择器是否正常工作。

      【讨论】:

      • 好吧,使用RelativeLayout我可以更改文本而不是将其放入图像中。
      • @MaximShoustin 好的,够了;)
      【解决方案5】:

      希望这些对某人有所帮助;

      1. 确保查看可点击。后代可以阻止点击事件。更多信息搜索以下属性。

      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

      【讨论】:

      • 感谢您解释 'android:state_pressed="false"' 如何让订单变得不重要。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多