【问题标题】:Android Theme drawable doesn't work with Color Drawable (Bug?)Android Theme drawable 不适用于 Color Drawable(错误?)
【发布时间】:2014-09-12 23:31:10
【问题描述】:

所以我正在尝试制作一个使用基于主题的颜色作为背景的selector。按照this SO answer 的说明,我首先在 res/values/colors.xml 中定义我的可绘制颜色:

<color name="selected">#FFF7C9</color>

然后我在 res/values/attrs.xml 中定义一个属性:

<attr name="drawable_selected" format="reference" />

然后在我的主题中,我将属性设置为我的可绘制颜色(res/values/styles.xml):

<style name="AppThemeWhite" parent="AppTheme">
    <item name="drawable_selected">@color/selected</item>
</style>

最后,我在选择器中引用了属性(res/drawable/selected_background):

<selector>
    <item android:state_activated="true" android:drawable="?drawable_selected" />
    <item android:drawable="@android:color/transparent" />
</selector>

当我运行它时,我在尝试对使用选择器的类进行膨胀时收到错误 Binary XML file line #2: Error inflating class &lt;unknown&gt;。但是,当我将选择器的state_activated 更改为直接使用android:drawable="@color/selected" 引用drawable 时,它​​可以工作。

这是一个错误,还是我做错了什么?

编辑

如果我添加一个颜色属性(res/values/attrs.xml)

<attr name="selected_color" format="color" />

并在我的主题中定义颜色 (res/values/styles.xml)

<item name="selected_color">#FFF7C9</item>

我可以根据它们更改可绘制的颜色(res/values/colors.xml)

<color name="selected">?selected_color</color>

并在我的选择器中使用android:drawable="@color/selected 直接引用drawable。 但是,这也会导致崩溃!并将可绘制的颜色更改回硬编码值#FFF7C9 修复它。看来整个主题系统已经很崩溃了……

【问题讨论】:

    标签: android xml android-layout themes


    【解决方案1】:

    原因

    是的,从 drawable(或颜色)引用自定义主题属性目前在 Android 上不起作用。

    您可以在此处查看有关很久以前报告的问题的更多详细信息:https://code.google.com/p/android/issues/detail?id=26251

    正如你所见,他们终于在 Android L 版本中解决了这个问题,但任何低于 L 的地方,这种引用都会失败。

    解决方案

    要解决此问题,您需要执行以下操作:

    <selector>
        <item android:state_activated="true" android:drawable="@color/selected" />
        <item android:drawable="@android:color/transparent" />
    </selector>
    

    @color/selected 定义为您帖子开头的位置:

    <color name="selected">#FFF7C9</color>
    

    【讨论】:

    • 我在 L 预览版中尝试过这个...也许只有在正式版本中?
    • 我现在无法自己测试它,所以我只能看到他们的问题跟踪器上所说的内容。但它是否已修复并不重要——您可能不想对其进行中继(除非您只想将您的应用程序定位在 L 上)。请使用解决方法。
    • 是的,我已经使用了这个解决方法,我只是想看看其他人是否面临同样的问题,以及是否应该要求重新打开问题报告。感谢您的所有帮助!
    • @woojoo666 如果您想重新打开该问题,您应该使用第二条评论中提供的项目在 L-preview 上对其进行测试。我提出了解决方案,因为您没有提到您已经使用此解决方法。顺便提一句。您正在寻找这个问题的什么答案?我已经向您确认这是一个已知问题,在 Android 错误跟踪器中提供了相关问题并提出了解决方法。我在任何时候误解了这个问题吗?请告诉我,如果不合适,我可以更新我的答案。
    • 对不起,我还在研究这个问题,我现在把它标记为答案,哈哈
    猜你喜欢
    • 1970-01-01
    • 2021-06-03
    • 2015-08-03
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    相关资源
    最近更新 更多