【问题标题】:Unable to use Color as drawable sometimes有时无法将颜色用作可绘制对象
【发布时间】:2013-03-06 16:59:52
【问题描述】:

我有以下选择器,效果很好。

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

注意,我可以将Color 用于drawable,如drawable-resouce.html

颜色资源也可以用作 XML 中的可绘制对象。例如, 创建状态列表可绘制时,您可以引用颜色 android:drawable 属性的资源 (android:drawable="@color/green")。

相当不错。现在,我想试试主题。

home_menu_text_view_selector.xml

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

attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="homeMenuTextViewPressedColor" format="color" />
</resources>

themes.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="Theme.X.Light.DarkActionBar" parent="Theme.Sherlock.Light.DarkActionBar">
        <item name="homeMenuTextViewPressedColor">@color/home_menu_text_view_pressed_color_inverse_holo_light</item>
    </style>
</resources>

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="home_menu_text_view_pressed_color_inverse_holo_light">#ff4fc5f1</color>
</resources>

现在,我会收到错误消息:-

原因:org.xmlpull.v1.XmlPullParserException: Binary XML file line 4:标签需要'drawable'属性或定义drawable的子标签

知道如何解决这个问题吗?

【问题讨论】:

  • 查看此链接stackoverflow.com/questions/4042924/…。它可能会回答你的问题。
  • 你在同一个文件中使用第二个xml sn -p 吗?如果是,则该文件不是格式正确的 XML。一个 XML 可以只有一个 root element.
  • 尝试将颜色放在单独的文件中(values/colors.xml)
  • 您的 colors.xml 中似乎缺少@android:color/transparent 的定义?
  • @PCoder @android:color/transparent 是系统颜色。

标签: android


【解决方案1】:

您正在尝试将属性转换为颜色,选择器需要颜色/可绘制对象。如果我正确理解你想要达到的目标,你可以完全摆脱它。

home_menu_text_view_selector.xml:

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

colors.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="home_menu_text_view_pressed_color_inverse_holo_light">#ff4fc5f1</color>
</resources>

主题是你需要找出你想要设计的究竟是什么。例如:

主题.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="Theme.X.Light.DarkActionBar" parent="Theme.Sherlock.Light.DarkActionBar">
        <item name="android:actionDropDownStyle">@style/MyDropDownNav</item>
    </style>
    <style name="MyDropDownNav">
        <item name="android:dropDownSelector">@drawable/home_menu_text_view_selector</item>
    </style>
</resources>

希望这会有所帮助。

编辑

没关系,我明白你现在想要做什么。这里解决了一个类似的问题:

Can a selector resource use a color defined in a style?

【讨论】:

  • 这个解决方案的问题是我必须创建多个 XML 来描述选择器,以便在不同的主题中使用。