如何在API 21以下设置主题颜色

4
我有一个drawable shape.xml文件,长这样,没有什么特别的:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">

    <corners android:radius="4dp"/>
    <solid android:color="?colorPrimary"/>
</shape>

当我在API 21以下运行时,程序会崩溃,因为我认为不能使用"?colorPrimary"。

用户可以选择不同的主题,那么在API 21以下,我可以用什么替代"?colorPrimary"?

如果我这样设置:

<solid android:color="@color/colorPrimary" />

然后我会为所有主题设置相同的颜色,这不是理想的。

在我的styles.xml文件中,用户可以选择10种不同的主题。

我明白我必须将drawable shape.xml移动到drawable-v21文件夹中,但是我应该如何更改上面默认的drawable文件夹中的相同shape.xml以获得相同的功能?


为什么不试试这个 -- android:textColor="@color/colorPrimary" - AbhayBohra
这个shape.xml被用作ListView项的背景。在我的蓝色主题中,背景是蓝色的,在我的红色主题中,B是红色的。 - Tord Larsen
我最终按照这里所接受的答案[https://dev59.com/E2sz5IYBdhLWcg3wOVP5]的方式进行了操作。 - Tord Larsen
3个回答

4
我们有另一种选择,不必在编译时在drawable中创建shape.xml,而是可以使用Java在运行时创建它。
在运行时获取主题颜色,并在创建形状时使用它。请注意保留HTML标记。
GradientDrawable gradientDrawable=new GradientDrawable();
gradientDrawable.setShape(GradientDrawable.OVAL);
gradientDrawable.setColor(getResources().getColor(R.color.colorAccent));
gradientDrawable.setSize(200,200);
gradientDrawable.setCornerRadius(100);

您可以通过以下方式从xml中填充现有形状并更改其属性:
GradientDrawable shapeDrawable= (GradientDrawable) 
ContextCompat.getDrawable(this,R.drawable.shape);
shapeDrawable.setColor(getResources().getColor(R.color.colorPrimary));
imageView.setImageDrawable(shapeDrawable);

0

我认为你应该在res文件夹中创建不同的values文件夹,如

values-v19 values-v21 等。

并且你还需要在java类中检查一件事情以防止强制关闭

// 检查我们是否在运行Android 5.0或更高版本

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    // Call some material design APIs here
} else {
    // Implement this feature without material design
}

不同的values文件夹如何设置shape.xml颜色。感觉我必须为每个主题创建10个shape.xml文件,我不知道该怎么做。 - Tord Larsen

0

你需要为不同的颜色主题编写不同的可绘制对象


创建10个drawable shape.xml文件,每个主题一个? - Tord Larsen
api 21以下不支持shape.xml中的任何颜色属性。 - Kamlakar Kate
如果您想要支持 API 版本 21 及以上,可以在 shape.xml 中使用 color 属性。 - Kamlakar Kate

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