无法在drawable中使用主题引用的颜色

4

Consider:

styles.xml

<style name="BlueTheme" parent="@android:style/Theme.Black.NoTitleBar">
    <item name="theme_color">@color/theme_color_blue</item>
</style>

attrs.xml

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

color.xml

<color name="theme_color_blue">#ff0071d3</color>

最后是可绘制的progress_bar.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:id="@android:id/background">
        <shape>
            <stroke
                android:width="2px"
                android:color="#ff515151" />

            <solid android:color="@color/transparent" />
        </shape>
    </item>
    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <solid android:color="?attr/theme_color" />
            </shape>
        </clip>
    </item>

</layer-list>

使用进度条 drawable 时:
<ProgressBar
    android:id="@+id/progressBarStartup"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:progressDrawable="@drawable/progress_bar"
    android:visibility="visible" />

我遇到了运行时错误。似乎Android无法获取颜色主题。

06-24 16:35:57.032: E/AndroidRuntime(3493): java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx.xxx.activities.startup.ActivityStartup}: android.view.InflateException: Binary XML file line #33: Error inflating class android.widget.ProgressBar


06-24 16:45:32.265: E/AndroidRuntime(9901): Caused by: android.content.res.Resources$NotFoundException: Resource is not a Drawable (color or path): TypedValue{t=0x2/d=0x7f010000 a=-1}

这行代码 @style/android:attr/progressBarStyleHorizontal 看起来不对。 - Kirill Rakhman
是的,抱歉,我编辑了问题。 - Seraphim's
第33行对应哪一行? - Kirill Rakhman
进度条在这种情况下不是很精确... - Seraphim's
1
尝试清理项目。Eclipse有时会搞乱ID。 - Kirill Rakhman
2个回答

3
是的,这似乎是一个已知的问题。但有一个解决方法。不要像你描述的那样使用?attr引用颜色,而是创建几个可绘制对象(与您拥有的不同颜色一样多),让每个对象直接调用其自己的颜色。在主题级别上,根据主题引用可绘制对象本身。这样就可以工作了。
更新:
在Lollipop上,您可以在XML中对可绘制对象进行着色。为了覆盖Pre-Lollipop版本,您可以简单地对所有相关的可绘制对象调用此方法(感谢较新版本的appcompat库)。
public void setDrawableColor(Drawable d, int color) {
  if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
    d = DrawableCompat.wrap(d);
    DrawableCompat.setTint(d.mutate(), color);
  }
}

你为什么认为他只有两个主题?如果他有200个主题,我不明白你的答案如何正确。我认为你回答的真正重点是:在这种用例中,你不能单一来源颜色。 - Justin
1
不幸的是,除非你只在 Lollipop 中使用可着色drawable,否则这仍然是唯一可用的解决方法。我在我的一个应用程序中有12个以上的主题,是的,拥有如此多的drawable变体很麻烦,但这就是它的工作方式。但我已经改变了措辞,如果需要可以说超过两个。 - Gábor

0

你应该使用 <attr name="theme_color" format="integer"/>


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