如何在api 21下面设置主题颜色

时间:2017-06-27 11:19:11

标签: android colors themes

我有这个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以给我相同的功能?

4 个答案:

答案 0 :(得分:3)

我们还有另一种选择 而不是在编译时在drawable中创建shape.xml 在运行时使用java创建它

在运行时获取主题的颜色,并在运行时创建形状时使用它

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);

答案 1 :(得分:0)

我认为您应该尝试在res文件夹中创建不同的值文件夹,如

值-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
}

答案 2 :(得分:0)

您必须为不同的颜色主题编写不同的drawable

答案 3 :(得分:0)

我最后这样做,检查接受的答案here。基本上是因为我不必更改现有的代码或工作区