ChatGPT解决这个技术问题 Extra ChatGPT

如何在Android中更改进度条的进度颜色

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

您是否尝试过 MyProgressBar.setProgressDrawable(Drawable d) 指定具有所需颜色的位图? developer.android.com/reference/android/widget/… developer.android.com/reference/android/graphics/drawable/…
是的,我已经尝试过了,但它不起作用。它设置整个进度条视图的背景颜色,而不是仅设置进度条本身的背景颜色。谢谢。
android:indeterminateTint="@android:color/white" 仅适用于 API >=21

T
Torben Kohlmeier

对于水平 ProgressBar,您也可以使用 ColorFilter,如下所示:

progressBar.getProgressDrawable().setColorFilter(
    Color.RED, android.graphics.PorterDuff.Mode.SRC_IN);

https://i.stack.imgur.com/0r60D.png

注意:这会修改应用中所有进度条的外观。要仅修改一个特定的进度条,请执行以下操作:

Drawable progressDrawable = progressBar.getProgressDrawable().mutate();
progressDrawable.setColorFilter(Color.RED, android.graphics.PorterDuff.Mode.SRC_IN);
progressBar.setProgressDrawable(progressDrawable);

如果 progressBar 不确定,则使用 getIndeterminateDrawable() 而不是 getProgressDrawable()

从 Lollipop (API 21) 开始,您可以设置进度色调:

progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));

https://i.stack.imgur.com/BOoLK.png


我想使用这个答案,因为在我看来它是最简单的答案,但我的进度条完全是红色的,与进度值无关。您确定要使用的模式吗?
@resus我有同样的问题,栏完全是红色的,看不到任何进展。但我解决了将 Mode.SRC_IN 更改为 Mode.MULTIPLY 的问题。
如果您使用不确定的进度,请不要忘记对 getIndeterminateDrawable 执行相同的操作。
请注意,此上下文中的“模式”是指 android.graphics.PorterDuff.Mode
如何不改变背景颜色?我只想更改进度颜色。
V
Vadim Kotov

这不是以编程方式进行的,但我认为无论如何它可以帮助很多人。我尝试了很多,最有效的方法是将此行添加到 .xml 文件中的 ProgressBar:

            android:indeterminate="true"
            android:indeterminateTintMode="src_atop"
            android:indeterminateTint="@color/secondary"

所以最后这段代码为我做了:

<ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyleLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:layout_marginTop="50dp"
            android:layout_marginBottom="50dp"
            android:visibility="visible"
            android:indeterminate="true"
            android:indeterminateTintMode="src_atop"
            android:indeterminateTint="@color/secondary">

此解决方案适用于 API 21+


如果必须设置动态颜色,则可以调用这些属性的 setter 方法。
@shriduttkothari 怎么可能是最好的?...它来自 21+
Android 从 4.x 最低版本转移时的最佳答案
这是一个很好的答案,只需在更改颜色的方法中使用 @TargetApi 注释,这样当它少于 API 21 时就不会崩溃
这是用于加载目的的常见对话进度的最佳答案。
W
WarrenFaith

很抱歉,这不是答案,但是是什么推动了从代码中设置它的要求?如果定义正确,.setProgressDrawable 应该可以工作

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

<item android:id="@android:id/background">
    <shape>
        <corners android:radius="5dip" />
        <gradient
                android:startColor="#ff9d9e9d"
                android:centerColor="#ff5a5d5a"
                android:centerY="0.75"
                android:endColor="#ff747674"
                android:angle="270"
        />
    </shape>
</item>

<item android:id="@android:id/secondaryProgress">
    <clip>
        <shape>
            <corners android:radius="5dip" />
            <gradient
                    android:startColor="#80ffd300"
                    android:centerColor="#80ffb600"
                    android:centerY="0.75"
                    android:endColor="#a0ffcb00"
                    android:angle="270"
            />
        </shape>
    </clip>
</item>

<item android:id="@android:id/progress">
    <clip>
        <shape>
            <corners
                android:radius="5dip" />
            <gradient
                android:startColor="@color/progress_start"
                android:endColor="@color/progress_end"
                android:angle="270" 
            />
        </shape>
    </clip>
</item>

</layer-list>

原因是我正在动态创建进度条,并根据用户请求设置其颜色。因为我通常使用代码来构建我的 GUI 屏幕和组件,所以我不熟悉附加的 XML,也不知道什么是层列表(尽管我猜你正在构建基于多个层的进度条..)。如果我确实想使用您附加的 XML - 我应该将它放在项目文件夹中的什么位置,我还需要做些什么来根据 XML 设置创建进度条吗?谢谢。
您将此 xml 保存为文件并将其放入可绘制文件夹(假设为 my_progress.xml ),而不是在 MyProgressBar.setProgressDrawable() 中将其设置为可绘制要更改颜色 - 您需要更改 @color/ 中的这些值progress_start @color/progress_end 它基本上是一个渐变,你可以把十六进制放在那里。
注意 - 文件是 SDK 中文件的副本。我在这里放弃了版权。如果您查看 res/drawable 文件夹,您会看到我发布的确切内容 - 颜色设置为黄色渐变,而不是自定义颜色。
它对我没有任何颜色变化。请告诉解决的颜色。
嗨,亚历克斯,您的回答非常好。但是,我试图在运行时更改自定义进度轮颜色。但是,我不能。请帮我解决我的问题..进度达到 100% 后,然后改变颜色并开始进度..我从这里下载代码..stackoverflow.com/questions/18503718/…
j
jhavatar

对于我不确定的进度条(微调器),我只是在可绘制对象上设置了一个滤色器。效果很好,只有一条线。

将颜色设置为红色的示例:

ProgressBar spinner = new android.widget.ProgressBar(
                context,
                null,
                android.R.attr.progressBarStyle);

spinner.getIndeterminateDrawable().setColorFilter(0xFFFF0000, android.graphics.PorterDuff.Mode.MULTIPLY);

https://i.stack.imgur.com/U46rN.png


我最喜欢你的回答。尽管我必须这样做,但为了让我的工作: myProgressBarSpinner.getIndeterminateDrawable().setColorFilter(new LightingColorFilter(0xFF000000, foregroundColorDesired));
另请注意,这样做会修改应用程序中所有进度条的可绘制对象。要仅对特定的一个执行此操作,请在 drawable 上调用 mutate(),然后在其上设置颜色过滤器,然后在您的进度条上调用 setIntederminateDrawable。
注意:那些使用这个并想知道为什么他们的颜色看起来不像他们输入的十六进制字符串的人,它上面有一个多色过滤器。将 android.graphics.PorterDuff.Mode.MULTIPLY 更改为 PorterDuff.Mode.SRC_IN,您将获得准确的十六进制颜色。
我认为他只需要这个答案..... android:indeterminateTint="@android:color/black"
我用作:progressBar= (ProgressBar) findViewById(R.id.progressBar); progressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(this,android.R.color.white), android.graphics.PorterDuff.Mode.MULTIPLY);
k
kirtan403

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

更改 colorAccent 也会更改您的 ProgressBar 的颜色,但这些更改也会反映在多个位置。因此,如果您只想为特定 PregressBar 使用不同的颜色,您可以通过将主题应用于该 ProgressBar 来做到这一点:

扩展你的默认主题并覆盖 colorAccent

在 ProgressBar 添加 android:theme 属性: android:theme="@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 更改 colorAccent

注意:使用 style 将不起作用。您只需使用 android:theme。您可以在此处找到更多主题的用法:https://plus.google.com/u/0/+AndroidDevelopers/posts/JXHKyhsWHAH


最后!谢谢,似乎没有多少开发人员使用 AppCompat,很多用户只是用 API 21+ 的解决方案投票支持答案,一点都不好,他们应该尽可能支持更多的设备/操作系统
惊人的!为我工作,但我必须确保在样式层次结构的某个地方有一个 parent="@style/Theme.AppCompat" 我有另一个父级,但它一开始不起作用。
@Nublodeveloper 是的,如果您注意到的话,我在第一行中提到了这一点。
@kirtan403 啊,是的,现在你提到它我明白了,但是当我第一次阅读它时我并没有这样理解。我读得太快了,我正在寻找代码。无论如何,谢谢,您的回答对我来说是最好的!
+1 喜欢您的解决方案。但是如何在java中设置主题的颜色???例如,如果我希望它是红色 #ff5900
R
Rasoul Miri

所有 API

如果使用所有 API 只需创建风格的主题

样式.xml

<resources>

    //...

    <style name="progressBarBlue" parent="@style/Theme.AppCompat">
        <item name="colorAccent">@color/blue</item>
    </style>

</resources>

并在使用中

<ProgressBar
    ...
    android:theme="@style/progressBarBlue" />

API 级别 21 及更高级别

如果在 API 级别 21 及更高级别中使用,请使用以下代码:

<ProgressBar
   //...
   android:indeterminate="true"
   android:indeterminateTintMode="src_atop"
   android:indeterminateTint="@color/secondary"/>

不错,我认为 style.xml 方法最好。(不需要超过 20 个 api)
D
Devinder Jhinjer

这对我有用。它也适用于较低版本。将此添加到您的 syles.xml

<style name="ProgressBarTheme" parent="ThemeOverlay.AppCompat.Light">
<item name="colorAccent">@color/colorPrimary</item>
</style>

并在 xml 中像这样使用它

<ProgressBar
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:theme="@style/ProgressBarTheme"
   />

我已在 CryptoTweets 示例应用程序中实现了这一点。我发现此解决方案不需要父主题即可按预期工作。 parent="ThemeOverlay.AppCompat.Light"
如果您想为默认进度条着色,最简单的解决方案。谢谢
@Saul_programa 很高兴知道,它可以帮助你
M
MOH3N

这对我有用:

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

仅用于 API 级别 21 及更高级别
P
PaulieG

根据一些建议,您可以使用颜色指定形状和可剪贴画,然后设置它。我有这个以编程方式工作。我就是这样做的。。

首先确保您导入可绘制库..

import android.graphics.drawable.*;

然后使用类似于下面的代码;

ProgressBar pg = (ProgressBar)row.findViewById(R.id.progress);
final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 };
pgDrawable = new ShapeDrawable(new RoundRectShape(roundedCorners, null,null));
String MyColor = "#FF00FF";
pgDrawable.getPaint().setColor(Color.parseColor(MyColor));
ClipDrawable progress = new ClipDrawable(pgDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
pg.setProgressDrawable(progress);   
pg.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.progress_horizontal));
pg.setProgress(45);

我尝试了上面的代码,不幸的是它只会导致“空”进度条。我错过了什么吗?
您需要在 ClipDrawable 上调用 setLevel。它取一个从 0 到 10000 的值。因此,progress.setLevel(2500) 将是 25%。
我已经提交了对答案的编辑,解释了“空”进度条的一个原因 - 以及修复它的 2 种方法(包括@HappyEngineer 的修复)
@RichardLeMesurier 您可以在评论部分发布解释+ 2 方式吗? progress.setLevel(2500) 对我不起作用,显然您的编辑由于某种原因未被接受。谢谢。 +1。
@ateiob 我写过a new answer to explain...
P
Paweł Tomkiel

如果不确定:

((ProgressBar)findViewById(R.id.progressBar))
    .getIndeterminateDrawable()
    .setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);

我用过这个,但它没有动画,只是应用了颜色......我正在使用圆形进度条
P
Paul
android:progressTint="#ffffff" 

H
Henrique de Sousa

现在在 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);
}

对于奖励积分,它不使用任何已弃用的代码。试试看!


不要忘记用 DrawableCompat.setTint(wrapDrawable.mutate(), ContextCompat.getColor(getContext(), android.R.color.holo_green_light));wrapDrawable.mutate() 打电话
刚刚在全新的 4.4.2 模拟器上尝试过(再次),它没有任何问题,请检查您的 .xml 设置以及是否有其他东西覆盖了 ProgressBar 颜色。
D
Debasish Ghosh

这就是我所做的。工作。

进度条:

<ProgressBar
            android:id="@+id/progressBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="4"
            android:indeterminateDrawable="@drawable/progressdrawable"
           />

progressdrawable.xml:这里使用渐变来改变你喜欢的颜色。并且 android:toDegrees="X" 增加 X 的值并且进度条快速旋转。减少并且它旋转缓慢。根据您的需要进行定制。

<?xml version="1.0" encoding="utf-8"?>
     <rotate xmlns:android="http://schemas.android.com/apk/res/android"
            android:duration="4000"
            android:fromDegrees="0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="360" >

            <shape
                android:innerRadius="20dp"
                android:shape="ring"
                android:thickness="4dp"
                android:useLevel="false" >
                <size
                    android:height="48dp"
                    android:width="48dp" />

                <gradient
                    android:centerColor="#80ec7e2a"
                    android:centerY="0.5"
                    android:endColor="#ffec7e2a"
                    android:startColor="#00ec7e2a"
                    android:type="sweep"
                    android:useLevel="false" />
            </shape>

        </rotate>

https://i.stack.imgur.com/mzbRK.png


@Ixx 运行时,它看起来不错。你无论如何都可以改变颜色的!
M
Mughil

适用于 SDK 21 及以上版本

android:indeterminateTint="@color/orange"

在 XML Works 中对我来说很容易。


如果要更改整个应用程序,请更改 #FE6C27 的值。在您的 Values/colors.xml 中。
p
pyko

在修改默认进度条的外观/感觉时遇到了同样的问题。以下是一些希望对人们有所帮助的信息:)

xml 文件的名称只能包含字符:a-z0-9_。 (即没有大写字母!)

要引用您的“drawable”,它是 R.drawable.filename

要覆盖默认外观,您可以使用 myProgressBar.setProgressDrawable(...),但是您不能只将自定义布局引用为 R.drawable.filename,您需要将其作为 Drawable 检索:Resource res = getResources( ); myProgressBar.setProgressDrawable(res.getDrawable(R.drawable.filename);

您需要在设置进度/次要进度/最大值之前设置样式(之后为我设置会导致“空”进度条)


A
A.I.Shakil

相信我,最简单的解决方案就是将其粘贴到 progressBar 中:

android:indeterminateTint="@android:color/white"

M
Mark Nashat

在 Xml 中添加 ProgressBar

适用于 SDK 21 及以上版本

android:indeterminateTint="@color/red"

他特别要求用“代码”来做这件事,这意味着用 Java,而不是 XML。除非他在你已经回答之后再补充。
是的,这已经发生了,但是您是否遇到了问题,我可以帮助您:)
A
Adriano Moutinho

您可以尝试更改样式、主题或在任何您想要的地方使用 android:indeterminateTint="@color/yourColor",但只有一种方法可以在任何 Android SKD 版本上使用:

如果您的进度条不是不确定的,请使用:

progressBar.getProgressDrawable().setColorFilter(ContextCompat.getColor(context, R.color.yourColor), PorterDuff.Mode.SRC_IN );

如果您的进度条不确定,请使用:

progressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), R.color.yourColor), PorterDuff.Mode.SRC_IN );

可惜安卓这么乱!


谢谢!它适用于不确定的 ProgressBar,但对于确定的它会用颜色绘制整个比例。
m
mieszk3

我是如何在水平 ProgressBar 中做到的:

    LayerDrawable layerDrawable = (LayerDrawable) progressBar.getProgressDrawable();
    Drawable progressDrawable = layerDrawable.findDrawableByLayerId(android.R.id.progress);
    progressDrawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);

我做了同样的事情,加上背景颜色的变化: layerDrawable.findDrawableByLayerId(android.R.id.background).setColorFilter(trackColor,PorterDuff.Mode.SRC);
这个答案以及@KamenDobrev 的评论是唯一真正做到了我想要的答案。当我只为进度可绘制设置一个颜色过滤器时,背景颜色也发生了变化。
H
Henrique de Sousa

这个答案中可能没有提到一件事:

如果您的主题继承自 Theme.AppCompat,则 ProgressBar 将采用您在主题中定义为 "colorAccent" 的颜色。

所以,使用..

@color/custom_color

..将 ProgressBar 的颜色自动着色为 @color/custom_color


我需要使用 @color/highlight
N
Naveed Ahmad

最简单的解决方案,如果您想更改布局 xml 文件中的颜色,请使用以下代码并使用 indeterminateTint 属性作为您想要的颜色。

    <ProgressBar
      android:id="@+id/progressBar"
      style="?android:attr/progressBarStyle"
      android:layout_width="wrap_content"
      android:indeterminate="true"
      android:indeterminateTintMode="src_atop"
      android:indeterminateTint="#ddbd4e"
      android:layout_height="wrap_content"
      android:layout_marginBottom="20dp"
      android:layout_alignParentBottom="true"
      android:layout_centerHorizontal="true" />

H
Hiroyuki Nuri

这个解决方案对我有用:

<style name="Progressbar.White" parent="AppTheme">
    <item name="colorControlActivated">@color/white</item>
</style>

<ProgressBar
    android:layout_width="@dimen/d_40"
    android:layout_height="@dimen/d_40"
    android:indeterminate="true"
    android:theme="@style/Progressbar.White"/>

S
Satyam Patil

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

<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

您应该指出这仅适用于 android API > 21
C
Community

要更改水平 ProgressBar 颜色(在 kotlin 中):

fun tintHorizontalProgress(progress: ProgressBar, @ColorInt color: Int = ContextCompat.getColor(progress.context, R.color.colorPrimary)){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        progress.progressTintList = ColorStateList.valueOf(color)
    } else{
        val layerDrawable = progress.progressDrawable as? LayerDrawable
        val progressDrawable = layerDrawable?.findDrawableByLayerId(android.R.id.progress)
        progressDrawable?.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
    }
}

要更改不确定的 ProgressBar 颜色:

fun tintIndeterminateProgress(progress: ProgressBar, @ColorInt color: Int = ContextCompat.getColor(progress.context, R.color.colorPrimary)){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        progress.indeterminateTintList = ColorStateList.valueOf(color)
    } else {
        (progress.indeterminateDrawable as? LayerDrawable)?.apply {
            if (numberOfLayers >= 2) {
                setId(0, android.R.id.progress)
                setId(1, android.R.id.secondaryProgress)
                val progressDrawable = findDrawableByLayerId(android.R.id.progress).mutate()
                progressDrawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
            }
        }
    }
}

它最终通常会为棒棒糖前的进度条着色

https://i.stack.imgur.com/UcilZ.png


C
Calin

还有一件小事,如果您继承基本主题,主题解决方案确实有效,因此对于应用程序压缩,您的主题应该是:

<style name="AppTheme.Custom" parent="@style/Theme.AppCompat">
    <item name="colorAccent">@color/custom</item>
</style>

然后在进度条主题中设置这个

<ProgressBar
    android:id="@+id/progressCircle_progressBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:theme="@style/AppTheme.Custom"
    android:indeterminate="true"/>

A
Amir Hossein Ghasemi

只需使用:

DrawableCompat.setTint(progressBar.getIndeterminateDrawable(),yourColor)

这真的很简单,似乎工作正常!谢谢
M
Mohammad Fneish

只需使用:

PorterDuff.Mode mode = PorterDuff.Mode.SRC_IN;
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
    mode = PorterDuff.Mode.MULTIPLY;
}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));
    progressBar.setProgressBackgroundTintList(ColorStateList.valueOf(Color.RED));
} else {
    Drawable progressDrawable;
    progressDrawable = (progressBar.isIndeterminate() ? progressBar.getIndeterminateDrawable() : progressBar.getProgressDrawable()).mutate();
    progressDrawable.setColorFilter(context.getResources().getColor(Color.RED), mode);
    progressBar.setProgressDrawable(progressDrawable);
}

A
Arnav Rao

水平进度条自定义材质样式:

改变背景颜色和水平进度条的进度。

<style name="MyProgressBar" parent="@style/Widget.AppCompat.ProgressBar.Horizontal">
    <item name="android:progressBackgroundTint">#69f0ae</item>
    <item name="android:progressTint">#b71c1c</item>
    <item name="android:minWidth">200dp</item>
</style>

通过设置样式属性将其应用于进度条,用于自定义材质样式和自定义进度条检查 http://www.zoftino.com/android-progressbar-and-custom-progressbar-examples


这需要最低 api 级别 21
A
Alécio Carvalho

使用 android.support.v4.graphics.drawable.DrawableCompat

            Drawable progressDrawable = progressBar.getIndeterminateDrawable();
            if (progressDrawable  != null) {
                Drawable mutateDrawable = progressDrawable.mutate();
                DrawableCompat.setTint(mutateDrawable, primaryColor);
                progressBar.setProgressDrawable(mutateDrawable);
            }

R
Richard Le Mesurier

发布以添加有关 PaulieG's answer 的信息,因为 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 的解决方案,我认为这是一个类似的解决方法,手动设置“进度”偏移量。无论哪种情况,上面的代码都应该适合您。


谢谢..这确实有效..但由于我的drawable是静态的(来自资源)..它不起作用。它仅在我添加“drawable.invalidateSelf();”后才起作用在 'setProgress(0)' 和 'setProgressDrawable(drawable)' 之前