代码之家  ›  专栏  ›  技术社区  ›  digitalbreed

文本视图背景色选择器

  •  115
  • digitalbreed  · 技术社区  · 14 年前

    我正在尝试改变Android的背景色 TextView 当用户触摸它时的小部件。为此,我创建了一个选择器,它存储在 res/color/selector.xml 大致是这样的:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:state_pressed="true"
            android:color="@color/semitransparent_white"
            />
        <item
            android:color="@color/transparent"
            />
    </selector>
    

    这个 clickable 的属性 文本框 true 如果有兴趣的话。

    当我将此选择器分配给 文本框 作为 android:background="@color/selector" ,我在运行时收到以下异常:

    错误/AndroidRuntime(13130):由以下原因引起:org.xmlpull.v1.xmlpullParserException:二进制XML文件行6:标记需要“drawable”属性或定义drawable的子标记

    当我将属性更改为drawable时,它会起作用,但结果看起来完全错误,因为ID似乎被解释为图像引用而不是颜色引用(正如“drawable”所示)。

    让我困惑的是,我可以直接设置一个颜色引用,例如“@color/black”作为背景属性。这按预期工作。使用选择器不起作用。

    我也可以使用选择器作为 textColor 没有问题。

    将背景颜色选择器应用于 文本框 在Android中?

    5 回复  |  直到 7 年前
        1
  •  212
  •   manfcas Benoit Martin    8 年前

    这里的问题是,您不能使用颜色选择器定义背景色,您需要 可拉伸的 选择器。因此,必要的更改如下:

    <?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/selected_state" />
    </selector>
    

    您还需要将该资源移动到 drawable 目录,因为它本身不是一个颜色选择器,所以它在其中更有意义。

    那么你就必须创建 res/drawable/selected_state.xml 像这样的文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" 
        android:shape="rectangle">
        <solid android:color="@color/semitransparent_white" />
    </shape>
    

    最后,您可以这样使用它:

    android:background="@drawable/selector"
    

    注释 :OP获取图像资源的原因可能是他试图引用仍在颜色目录中但使用 @drawable 所以他最终导致了ID冲突,选择了错误的资源。

    希望这仍然可以帮助一些人,即使行动可能,我希望,解决他的问题,到现在为止。

        2
  •  109
  •   Jenever    7 年前

    Benoit的解决方案是可行的,但是你真的不需要花费太多的开销来绘制一个形状。因为颜色可以绘制,所以只需在a/res/values/colors.xml文件中定义一种颜色:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <color name="semitransparent_white">#77ffffff</color>
    </resources>
    

    然后在选择器中使用:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:state_pressed="true"
            android:drawable="@color/semitransparent_white" />
    </selector>
    
        3
  •  78
  •   Jason Robinson    13 年前

    更简单的解决方案:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true">
            <color android:color="@color/semitransparent_white" />
        </item>
        <item>
            <color android:color="@color/transparent" />
        </item>
    </selector>
    

    把它放在可抽出的文件夹里,你就可以走了。

        4
  •  15
  •   Maksim Dmitriev    11 年前

    即使这样也行。

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true" android:drawable="@color/dim_orange_btn_pressed" />
        <item android:state_focused="true" android:drawable="@color/dim_orange_btn_pressed" />
        <item android:drawable="@android:color/white" />
    </selector>
    

    我添加了 android:drawable 属性,它们的值是颜色。

    顺便问一下,他们为什么这么说 color selector ?他们不写那个 Android:可拖动 是必需的。

    Color State List Resource

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android" >
        <item
            android:color="hex_color"
            android:state_pressed=["true" | "false"]
            android:state_focused=["true" | "false"]
            android:state_selected=["true" | "false"]
            android:state_checkable=["true" | "false"]
            android:state_checked=["true" | "false"]
            android:state_enabled=["true" | "false"]
            android:state_window_focused=["true" | "false"] />
    </selector>
    
        5
  •  4
  •   Dasser Basyouni    8 年前

    对于在不创建背景扇区的情况下进行搜索的用户,只需将这些行添加到 TextView

    android:background="?android:attr/selectableItemBackground"
    android:clickable="true"
    

    另外,要使其可选,请使用:

    android:textIsSelectable="true"