如何在Android的渐变Drawable中向android:startColor添加主题属性?

5
根据Android文档,android:startColor可以将属性作为值,如下所示:

这也可以是对资源的引用(形式为“@[package:]type:name”)或主题属性(形式为“?[package:][type:]name”),其中包含此类型的值。

我尝试向我的渐变可绘制对象添加属性,但是出现了错误。以下是可绘制对象的代码:
以下是style.xml中的代码:
<style name="test" parent="android:Theme">
    <item name="android:startColor">#0b2749</item> 
    <item name="startColor">#0b2749</item>
</style>

当我尝试运行该活动时,出现以下错误消息:
01-10 20:47:30.810: E/AndroidRuntime(7279): Caused by: java.lang.UnsupportedOperationException: Can't convert to color: type=0x2

我尝试将?startColor更改为?attr/startColor,但仍然出现相同的错误。我还在AndroidManifest.xml文件中将主题应用于活动。

我该如何向渐变可绘制对象添加主题属性?


在 Android 上也遇到了同样的问题,就是在描边元素上使用 android:color。实际上,每当我们尝试从可绘制对象引用样式属性时,似乎都会出现此异常。这看起来像是 Android 的一个 bug。 - Guillaume
我找到了一个解决方法,可能对你有用,请看我的答案。 - Guillaume
3个回答

3

我在我的一个可绘制对象中遇到了同样的问题,我希望根据所选主题使用不同的颜色。我找到了一个解决方法,它并不能完全解决问题,但对我来说可行。我不是在样式中定义颜色,而是将整个可绘制对象定义为引用。

attrs.xml 中:

<resources>
    <attr name="myDrawable" format="reference"/>
<resources>

在我的style.xml文件中:

<style name="style1">
    <item name="myDrawable">@drawable/myDrawable1</item>
<style>
<style name="style2">
    <item name="myDrawable">@drawable/myDrawable2</item>
<style>

当然,您需要在drawable文件夹中定义两个drawable:myDrawable1myDrawable2,每个都有正确的颜色硬编码。这样就可以正常工作了。

谢谢。我知道这个解决方案,而我想通过属性来解决的原因是为了减少我的应用程序中的可绘制对象数量,以使其易于管理,因为它们已经太多了。 - Kalimah
是的,我有同样的担忧,这就是为什么我只称之为一种解决方法。尽管如此,我仍然对寻找真正的解决方案感兴趣,但我开始怀疑是否存在这样的解决方案,它看起来越来越像一个Android的bug或特性... - Guillaume
此外,drawable 文件夹中不能有子文件夹这一事实对于中大型项目来说是一个痛点(我的某个项目中有 5000 多个项...) - Guillaume
子文件夹问题可以通过使用正确的命名约定来解决,例如:folder_file_or_drawable_name.xml。 - Kalimah

0
<style name="customTheme" parent="android:Theme">  
    <item name="android:windowTitleBackgroundStyle">@style/WindowTitleBackground</item>
</style>

将上述代码添加到values文件夹中的colors.xml中,然后将以下代码添加到styles.xml中。
<color name="titlebackgroundcolor">#FFFFFF</color>
<color name="titletextcolor">#000000</color>

代码不清晰。您能否格式化一下,以便我可以测试它? - Kalimah
只需在style和item中添加<和>标签即可,我无法放置它,因为这会使文本变得不可见。 - Rashmi.B
<style name="customTheme" parent="android:Theme"> <item name="android:windowTitleBackgroundStyle">@style/WindowTitleBackground</item> </style> 将上述代码添加到 values 文件夹中的 colors.xml 中,并将以下代码添加到 styles.xml:<color name="titlebackgroundcolor">#FFFFFF</color><color name="titletextcolor">#000000</color> - Rashmi.B
我该如何将这个应用到渐变可绘制对象? - Kalimah

-1

看起来你在颜色方面犯了一个小错误。 Android使用#[alpha] [hex]类型的输入来表示颜色。你只提供了十六进制部分。 Android不支持这种方式,因此出现了UnsupportedOperationException

尝试使用以下内容:

<item name="android:startColor">#FF0b2749</item>

我不能保证这会起作用,因为我从未在样式中与渐变一起工作过。


实际上,Android支持没有alpha值的颜色。根据同一份文档:必须是颜色值,格式为“#rgb”,“#argb”,“#rrggbb”或“#aarrggbb”。 - Kalimah
嗯,你知道的越多。 之前有一段时间遇到了问题,直到我添加了alpha才解决了,但是现在知道不需要也可以工作。 - Sander van't Veer
然而,这并没有解决问题:无论是否有alpha值,都会出现相同的异常。 - Guillaume

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接