我在我的Android应用程序中使用水平进度条,我想改变它的进度颜色(默认为黄色)。我如何使用代码(而不是XML)做到这一点?


当前回答

发布了关于PaulieG的答案的补充信息,因为ateiob让我解释一些事情…


我可以说,在ProgressBar代码中存在(或者至少是,当我查看当前版本的Android源代码时)一个错误/问题/优化,忽略了将进度设置为已经存在的值的尝试。

例如,如果progress = 45,而你试图将其设置为45,代码将什么都不做,也不会重绘进度。

调用ProgressBar.setProgressDrawable()后,你的进度条将是空白的(因为你改变了可绘制的部分)。

这意味着你需要设置进度,并重新绘制它。但是如果您只是将进度设置为保留值,它将什么也不做。

您必须先将其设置为0,然后再次设置为“旧”值,然后条将重新绘制。


总结一下:

保留“旧的”进度值 更新可绘制/颜色(使栏空白) 将进度重置为0(否则下一行不执行任何操作) 将进度重置为“旧”值(修复条) 无效


下面是一个方法,我有这样做:

protected void onResume()
{
    super.onResume();
    progBar = (ProgressBar) findViewById(R.id.progress_base);

    int oldProgress = progBar.getProgress();

    // define new drawable/colour
    final float[] roundedCorners = new float[]
        { 5, 5, 5, 5, 5, 5, 5, 5 };
    ShapeDrawable shape = new ShapeDrawable(new RoundRectShape(
        roundedCorners, null, null));
    String MyColor = "#FF00FF";
    shape.getPaint().setColor(Color.parseColor(MyColor));
    ClipDrawable clip = new ClipDrawable(shape, Gravity.LEFT,
        ClipDrawable.HORIZONTAL);
    progBar.setProgressDrawable(clip);

    progBar.setBackgroundDrawable(getResources().getDrawable(
        android.R.drawable.progress_horizontal));

    // work around: setProgress() ignores a change to the same value
    progBar.setProgress(0);
    progBar.setProgress(oldProgress);

    progBar.invalidate();
}

至于HappyEngineer的解决方案,我认为它是一个类似的解决方案,手动设置“进度”偏移量。无论哪种情况,上面的代码都应该适用于您。

其他回答

这招对我很管用:

<ProgressBar
 android:indeterminateTint="#d60909"
 ... />

适用于SDK 21及以上版本

android:indeterminateTint="@color/orange"

对我来说是很简单的。

更改进度条的前景和背景颜色的最简单的方法是

<ProgressBar
                        style="@android:style/Widget.ProgressBar.Horizontal"
                        android:id="@+id/pb_main"
                        android:layout_width="match_parent"
                        android:layout_height="8dp"
                        android:progress="30"
                        android:progressTint="#82e9de"
                        android:progressBackgroundTint="#82e9de"
                        />

只需添加

                        android:progressTint="#82e9de" //for foreground colour
                        android:progressBackgroundTint="#82e9de" //for background colour

这是一个老问题,但这里没有提到使用主题。如果你的默认主题是使用AppCompat,你的ProgressBar的颜色将是你已经定义的colorAccent。

改变colorAccent也会改变你的ProgressBar的颜色,但这些变化也反映在多个地方。所以,如果你想为一个特定的ProgressBar使用不同的颜色,你可以通过应用theme到那个ProgressBar来实现:

扩展默认主题并覆盖colorAccent <样式名= " AppTheme。WhiteAccent”> <item name="colorAccent">@color/white</item> <!——你想要什么颜色都行——> > < /风格 在ProgressBar中添加android:theme属性: android:主题= " @style / AppTheme。WhiteAccent”

所以它看起来是这样的:

<ProgressBar
        android:id="@+id/loading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:padding="10dp"
        android:theme="@style/AppTheme.WhiteAccent" />

你只是在为你特定的ProgressBar改变一个颜色重音。

注意:使用样式将不起作用。你只需要使用android:theme。 你可以在这里找到更多关于theme的用法:https://plus.google.com/u/0/+AndroidDevelopers/posts/JXHKyhsWHAH

如今在2016年,我发现一些前棒棒糖设备不尊重colorAccent设置,所以我对所有api的最终解决方案现在如下:

// fixes pre-Lollipop progressBar indeterminateDrawable tinting
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {

    Drawable wrapDrawable = DrawableCompat.wrap(mProgressBar.getIndeterminateDrawable());
    DrawableCompat.setTint(wrapDrawable, ContextCompat.getColor(getContext(), android.R.color.holo_green_light));
    mProgressBar.setIndeterminateDrawable(DrawableCompat.unwrap(wrapDrawable));
} else {
    mProgressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), android.R.color.holo_green_light), PorterDuff.Mode.SRC_IN);
}

另外,它没有使用任何弃用代码。试一试!