【问题标题】:Selector on background color of TextViewTextView 的背景颜色上的选择器
【发布时间】:2011-04-05 07:13:06
【问题描述】:

当用户触摸它时,我正在尝试更改 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>

TextView 的 clickable 属性是 true,如果感兴趣的话。

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

ERROR/AndroidRuntime(13130):原因:org.xmlpull.v1.XmlPullParserException:二进制 XML 文件第 6 行:标签需要 'drawable' 属性或定义可绘制对象的子标签

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

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

我也可以毫无问题地将选择器用作textColor。

在 Android 中将背景颜色选择器应用于 TextView 的正确方法是什么?

【问题讨论】:

  • 一种颜色可以被解释为一个drawable。结果到底错在哪里?
  • 它不是显示颜色,而是显示我的可绘制资源中的图像作为背景。
  • 如果您使用 android:drawable,而不是 android:color,以上内容应该可以工作 - 至少在这种情况下它适用于我:android:drawable="@color/my_custom_color"。我的颜色在 values/colors.xml 中定义

标签: android


【解决方案1】:

Benoit 的解决方案有效,但您确实不需要承担绘制形状的开销。由于颜色可以是可绘制的,只需在 /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>

【讨论】:

  • 由于某种原因,您的解决方案不是显示颜色,而是显示我的可绘制资源文件夹中的随机图像。我试图清理项目/修复属性/重新保存/重新打开 Eclipse,因为它看起来很奇怪,但无济于事。很奇怪。
  • @Yahel 您可能将颜色可绘制资源命名为与实际可绘制文件相同?
  • @Jona :不,但是可绘制对象被命名为 background_application 并且颜色可绘制对象被命名为 background_white_transparent。两者都有背景......我在其他一些线程上看到同样的事情发生在其他人身上,所以我将其作为众多 Android 错误之一归档,并修改了我的整个布局以解决它。
  • @Yahel Mmm...好吧,我看到了这个问题,但在我的情况下,文件名不一样...在这里查看我的问题stackoverflow.com/questions/9004744/…
  • 没能成功,Benoit Martin 的回答很好。
【解决方案2】:

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

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

也让它可选择使用:

android:textIsSelectable="true"

【讨论】:

  • 太有用了!! “android:attr”中还有其他有用的属性吗?谢谢
【解决方案3】:

这里的问题是你不能使用颜色选择器定义背景颜色,你需要一个drawable选择器。因此,必要的更改如下所示:

<?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 冲突,选择了错误的资源。

希望这仍然可以帮助某人,即使我希望 OP 现在可能已经解决了他的问题。

【讨论】:

  • 谢谢,伯努瓦。问题解决了(我必须承认,我不记得我到底是怎么做到的),项目也顺利完成了。感谢您回到这里发布并帮助人们在未来遇到同样的问题,伟大的精神!
  • 我无法完成这项工作。我正在尝试将它应用到一个按钮,它确实将背景设置为选择器的默认颜色,但它不会更改为 state_pressed 中定义的形状。我会错过什么?我可能会提出一个新问题,以防你能指出我正确的方向。
  • @Maragues 很难在没有看到任何代码的情况下判断。我建议您打开一个新问题并发布相关代码,以便我们找出可能出现的问题。您也可以在此帖子中添加评论,并带有指向您的新帖子的链接。
  • 为什么不直接在选择器项中直接使用“drawable="@color/your_color"?您不需要定义任何形状或任何其他文件,只需在值中定义颜色即可/colors.xml(最好不要硬编码颜色)。
  • 不工作。它向我展示了与我在形状 xml 中声明的两种颜色不同的颜色。
【解决方案4】:

即使这样也行。

<?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:drawable 是必需的。

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>

【讨论】:

  • color 属性在您设置 textview 颜色但不使用背景时有效,因为实际上背景上的颜色被用作 ColorDrawable
  • 实现上述所有最佳和最简单的解决方案。
【解决方案5】:

一个更简单的解决方案:

<?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>

将其保存在可绘制文件夹中,然后就可以开始了。

【讨论】:

  • 也许这可行,但官方不支持(Android Studio 将其视为错误)。
  • @Blackhex 奇怪。在 Eclipse 中对我来说效果很好。这可能是一个 Lint 错误,如果是,您应该能够禁用或忽略它。
  • 这是我认为的解决方案。
  • &lt;item android:state_pressed="true" android:color="@color/vantablack"/&gt; 在语义上与 &lt;item android:state_pressed="true"&gt;&lt;color android:color="@color/vantablack"/&gt;&lt;/item&gt; 相同
  • 在我的情况下,我需要将 &lt;color android:color="@color/semitransparent_white" /&gt; 更改为 &lt;color android:drawable="@color/semitransparent_white" /&gt;
猜你喜欢
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
相关资源
最近更新 更多