我有一个Progressbar,它看起来是在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>
<corners android:radius="@dimen/round_corners_elements" />
<solid android:color="@color/blue_50" />
<stroke android:width="1px" android:color="@color/light_gray" />
</shape>
</item>
<item android:id="@android:id/progress">
<clip android:clipOrientation="horizontal" android:gravity="left">
<shape>
<corners
android:radius="@dimen/round_corners_elements"
/>
<solid android:color="@color/signaling_color" />
<stroke android:width="1px" android:color="@color/light_gray" />
</shape>
</clip>
</item>
</layer-list>
但是由于我需要动态地将背景颜色(blue50)更改为任何其他颜色,我失败了。任何人都知道如何以编程方式更改它?进展可以保持不变。特别的是,进度条有圆角,这是必要的。我尝试了几种方法,但没有一种方法适合我。
setBackgroundTintList没有工作,只有&gt; API21
int[][] states = new int[][] { new int[] { android.R.attr.background }, new int[] { -android.R.attr.process } };
int[] colors = new int[] { Color.parseColor("#000000"), Color.BLACK };
ColorStateList myList = new ColorStateList(states, colors);
progressBar.setBackgroundTintList(myList);
progressBar.setBackgroundTintMode(PorterDuff.Mode.SRC_OVER);
setBackgroundColor也没有效果:
progressBar.setBackgroundColor(ContextCompat.getColor(this, R.color.white));
有人有个主意吗?
答案 0 :(得分:2)
您必须获得ProgressBar
使用的LayerDrawable
,然后
findDrawableByLayerId(android.R.id.background)
获取该图层的Drawable
并在运行时对其进行修改; 或强> Drawable
并致电setDrawableByLayerId(android.R.id.background, newBackgroundDrawable)
如果我没记错的话,<shape>
标签会导致系统在运行时创建GradientDrawable
,并且方便地使用setColor()
等方法
答案 1 :(得分:0)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
progressBar.setProgressBackgroundTintList(ColorStateList.valueOf(tint));
} else {
LayerDrawable drawable = (LayerDrawable) progressBar.getProgressDrawable();
Drawable background = new ColorDrawable(tint);
drawable.setDrawableByLayerId(android.R.id.background, background);
progressBar.setProgressDrawable(drawable);
}