java Android - ProgressBar setProgress() 方法不会更新可绘制的进度条

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/43489433/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 07:28:25  来源:igfitidea点击:

Android - ProgressBar setProgress() method doesn't update the progress bar drawable

javaandroidmultithreading

提问by Hayk Abelyan

I set a circular progress bar (from 0 to 100) for showing a time running progress (from 1:00 to 0:00). When time is 1:00, the progress must be 0, when time is 0:00, the progress must be 100.

我设置了一个圆形进度条(从 0 到 100)来显示时间运行进度(从 1:00 到 0:00)。时间为 1:00 时,进度必须为 0,时间为 0:00 时,进度必须为 100。

<ImageView
    android:layout_width="@dimen/_56sdp"
    android:layout_height="@dimen/_56sdp"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="@dimen/_2sdp"
    android:src="@drawable/a_circular_black" />

<ProgressBar
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="@dimen/_56sdp"
    android:layout_height="@dimen/_56sdp"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="@dimen/_2sdp"
    android:max="100"
    android:progress="26" //I set the progress 26 to show what it will be look like. Normally for 1:00 the progress must be 0.
    android:progressDrawable="@drawable/a_circular" />

<TextView
    android:id="@+id/textViewTimer"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="@dimen/_17sdp"
    android:text="1:00"
    android:textColor="#000000"
    android:textSize="@dimen/_18sdp"
    android:textStyle="bold" />

Here's the progress bar background:

这是进度条背景:

    <?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@android:id/progress">
        <rotate
            android:fromDegrees="270"
            android:toDegrees="270"
            android:pivotX="50%"
            android:pivotY="50%" >
            <shape
                android:innerRadiusRatio="2.5"
                android:shape="ring"
                android:thickness="@dimen/_3sdp" >
                <size android:width="@dimen/_56sdp" android:height="@dimen/_56sdp" />
                <gradient
                    android:centerColor="#FFA708"
                    android:endColor="#FFA708"
                    android:startColor="#FFA708"
                    android:type="sweep" />
            </shape>
        </rotate>
    </item>
</layer-list>

Here's the image background:

这是图片背景:

<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="oval">
            <size
                android:width="60dp"
                android:height="60dp" />
            <stroke
                android:width="3dp"
                android:color="#ccc" />
            <padding
                android:bottom="3dp"
                android:left="3dp"
                android:right="3dp"
                android:top="3dp" />
        </shape>
    </item>
    <item android:id="@android:id/progress">
        <rotate
            android:fromDegrees="270"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="270">
            <shape
                android:shape="oval">
                <size
                    android:width="60dp"
                    android:height="60dp" />
                <gradient
                    android:centerColor="#000"
                    android:endColor="#000"
                    android:startColor="#000"
                    android:type="sweep" />

                <padding
                    android:bottom="3dp"
                    android:left="3dp"
                    android:right="3dp"
                    android:top="3dp" />
            </shape>
        </rotate>
    </item>
    <item>
        <shape android:shape="oval">
            <size
                android:width="60dp"
                android:height="60dp" />
            <solid android:color="#ccc" />
        </shape>
    </item>
</layer-list>.

So, on my layout preview it appears like this:

所以,在我的布局预览中,它看起来像这样:

I set the progress 26 to show what it will be look like. Normally for 1:00 the progress must be 0.

我将进度设置为 26 以显示它的外观。 通常对于 1:00,进度必须为 0。

In my onCreateI set the progress 0

在我的onCreate我设置进度 0

progressBar = (ProgressBar) findViewById(R.id.progressBar);
progressBar.setProgress(0); 

And then, when my time runs in it's thread, the timer updates itself:

然后,当我的时间在它的线程中运行时,计时器会自动更新:

private class TimeRun implements Runnable {

    @Override
    public void run() {
        while (timeLeft > 0) {
            try {
                Thread.sleep(100);
                timeLeft = timeLeft - 100;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    progressBar.setProgress(100 - (int) ((double) timeLeft / ((double) 60000) * 100));
                    if (timeLeft < 10000)
                        textViewTimer.setText("0:0" + timeLeft / 1000);
                    else
                        textViewTimer.setText("0:" + timeLeft / 1000);
                }
            });
        }
}

When I run the activity, the progress bar is showing 100, thought it should have been 0 (black circle). And it shows no change during the run time. The text view updates normally, but progress bar shows no change. The logs show me that the progress is updating, but graphically there are no changes.

当我运行活动时,进度条显示 100,认为它应该是 0(黑色圆圈)。它在运行时没有显示任何变化。文本视图正常更新,但进度条未显示任何变化。日志显示进度正在更新,但在图形上没有任何变化。

progress bar doesn't updateI tried to update it by posting a Runnable, I checked this question too, but the answers didn't help me

进度条不更新我试图通过发布一个 Runnable 来更新它,我也检查了这个问题,但答案对我没有帮助

android progressBar does not update progress view/drawable

android progressBar 不更新进度视图/drawable

Can you suggest me any solution?

你能给我建议任何解决方案吗?

采纳答案by SangLe

Take a look this solution. It worked. http://demonuts.com/2017/01/02/android-circular-progress-bar-percentage/It is due to your progress bar background.

看看这个解决方案。有效。 http://demonuts.com/2017/01/02/android-circular-progress-bar-percentage/这是由于您的进度条背景。

回答by Kishore Jethava

Try like this

像这样尝试

runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Integer value  =  100 - (int) ((double) timeLeft / ((double) 60000) * 100);
                progressBar.setProgress(value);
                if (timeLeft < 10000)
                    textViewTimer.setText("0:0" + timeLeft / 1000);
                else
                    textViewTimer.setText("0:" + timeLeft / 1000);
            }
        });

回答by NehaK

You should use CountDownTimerinstead, this will be easier than using a thread:

您应该CountDownTimer改用,这比使用线程更容易:

// here your total time is 1 minute = 1 * 60 * 1000 ms
// and ticks time is 1 sec = 1000 ms
new CountDownTimer(1 * 60 * 1000, 1000) {

    public void onTick(long millisUntilFinished) {
       // this will be alled in interval of 1 sec
       // here you can have your logic to update progressBar or textbar
    }

    public void onFinish() {
       // this will be called when timer will be fixished - afetr 1 min
       // here you can have your logic to update progressBar to 0 again
    }

}.start();

If it still not working for you then you should use Synchized() when updating ProgressBar, because I was getting same issue and this solved that :

如果它仍然不适合你,那么你应该在更新 ProgressBar 时使用 Synchized(),因为我遇到了同样的问题,这解决了:

synchronized (this) {
    progressBar.setProgress(100 - (int) ((double) timeLeft / ((double) 60000) * 100));
}

or

或者

synchronized (YourActivity.this) {
    progressBar.setProgress(100 - (int) ((double) timeLeft / ((double) 60000) * 100));
}