Android - ProgressBar setProgress()方法不会更新进度条drawable

时间:2017-04-19 07:38:59

标签: java android multithreading

我设置循环进度条(从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" />

这是进度条背景:

    <?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>

这是图像背景:

<?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>.

因此,在我的布局预览中,它显示如下:

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

在我的onCreate我设置进度0

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

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

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

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

progress bar doesn't update 我尝试通过发布Runnable来更新它,我也检查了这个问题,但答案对我没有帮助

android progressBar does not update progress view/drawable

你能建议我解决吗?

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您应该使用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();

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

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

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

答案 2 :(得分:0)

试试这个

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

答案 3 :(得分:0)

只需使用水平进度条样式并使用圆形可绘制。

 style="?android:attr/progressBarStyleHorizontal"
 android:progressDrawable="@drawable/circular_progress"