我有这个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以给我相同的功能?
答案 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。基本上是因为我不必更改现有的代码或工作区