android progressBar does not update progress view/

2019-01-06 15:56发布

two Bars which shows the progress of a game. If the user get points or time is up etc the progressBars should be updated:

private TextView tv;
private ProgressBar levelHoldBar;
private ProgressBar levelUpBar;

//...
private void updateViews() {

    // ...
    levelHoldBar.setMax(currentLevel.getThreshold());
    levelHoldBar.setProgress(currentPoints > currentLevel.getThreshold() ? currentLevel.getThreshold() : currentPoints);

    levelUpBar.setMax(nextLevel.getThreshold());
    levelUpBar.setProgress(currentPoints > nextLevel.getThreshold() ? nextLevel.getThreshold() : currentPoints);

    tv.setText(currentPoints+"/"+currentLevel.getThreshold());

    Log.d(TAG, "hold prog/max "+levelHoldBar.getProgress()+"/"+levelHoldBar.getMax());
    Log.d(TAG, "up   prog/max "+levelUpBar.getProgress()+"/"+levelUpBar.getMax());
}

ie. Outputs:

12-03 17:48:33.918: DEBUG/MainActivity(6829): hold prog/max 20/20
12-03 17:48:33.918: DEBUG/MainActivity(6829): up   prog/max 20/50

The Log.d(...) in the end shows ALWAYS the correct values, but SOMETIMES the visual bars of the progressBars do not show the correct progesses. They show progresses that had been set previously even if the getters for "max" and "progress" return correct values (in the example the bar shows about 20% (instead of 100%) for the levelHoldBar and about 2% (instead of 40%) for the levelUp-bar). I cannot figure out, why the log-output is correct but the drawables are wrong!? The TextView (tv) is updated correctly! Whats going on here? How can I fix that?

14条回答
forever°为你锁心
2楼-- · 2019-01-06 16:07

For me, calling setMax() before setProgress() worked for some reason.

查看更多
Evening l夕情丶
3楼-- · 2019-01-06 16:11

Make sure style for the progressBar is set to be style="@android:style/Widget.ProgressBar.Horizontal" otherwise it will show Indeterminate Progress

(Just in case it will help someone)

查看更多
狗以群分
4楼-- · 2019-01-06 16:11

I tried all solutions listed, they did not work. Turns out... the real problem was my code was busy running, essentially blocking the UI thread. So the proper solution which instantly fixed the problem was... put my busy code inside an async task.

In my case I was loading several thousand record from XML into a SQLite database. Naturally I wanted to update the progress bar. Code that should have done this ( prg_bar.setProgress(iProgressPercentage) ) did nothing, and at the end of the load, the UI finally got a chance to run. Poof, progress bar goes from zero to 100.

Same code put into the onProgressUpdate() of the async task, wrapped around the same functional code, worked perfectly. This makes me very skeptical of the idea "that there's a bug in the progress bar code" and that setting the max and to zero or any of those things were ever more than a coincidental work around.

查看更多
Anthone
5楼-- · 2019-01-06 16:13

In my case, I create VerticalSeekBar, and solution of Stuck does not work. After hours, I have found a solution:

@Override
public synchronized void setProgress(int progress) {
    super.setProgress(progress);
    onSizeChanged(getWidth(), getHeight(), 0, 0);
}

Hope that help anyone.

查看更多
太酷不给撩
6楼-- · 2019-01-06 16:17

SOLUTION: It's a Bug in ProgressBar!

finally... I think I found the solution...

this does not work as one would expect:

bar.setMax(50);
bar.setProgress(20);
bar.setMax(20);
bar.setProgress(20);

The setProgress(...) seems to not trigger the update on the drawable if the same value is passed again. But it's not triggered during the setMax, too. So the update is missing. Seems like a Bug in the android ProgressBar! This took me about 8 hours now.. lol :D

To solve this, I'm just doing a bar.setProgress(0) before each update... this is only a workaround, but it works for me as expected:

bar.setMax(50);
bar.setProgress(20);
bar.setProgress(0); // <--
bar.setMax(20);
bar.setProgress(20);
查看更多
Animai°情兽
7楼-- · 2019-01-06 16:21

I was able to get this to work with View.post():

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    // ...

    mSeekBar.post(new Runnable() {
        @Override
        public void run() {
            mSeekBar.setProgress(percentOfFullVolume);
        }
    });
}

As with SKTs answer it is unclear to me why this should work when this does not

mSeekBar.setProgress(percentOfFullVolume);

However, it seems to be true up to and including Android Lollipop.

查看更多
登录 后发表回答