android progressBar不会更新进度视图/ drawable

Stu*_*uck 22 android progress-bar

两个条形图显示了游戏的进度.如果用户获得积分或时间等,则应更新progressBars:

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());
}
Run Code Online (Sandbox Code Playgroud)

即.输出:

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
Run Code Online (Sandbox Code Playgroud)

到底Log.d(...)表示总是正确的价值观,但SOMETIMES的progressBars的可视化条不显示正确的进度变化.它们显示先前设定的进度,即使"最大"和"进度"的吸气剂返回正确的值(在示例中,条形图显示levelHoldBar约20%(而不是100%)和约2%(而不是40%) %)为levelUp-bar).我无法弄清楚,为什么日志输出是正确的但是drawables是错误的!?TextView(tv)正确更新!这里发生了什么?我该如何解决这个问题?

Stu*_*uck 45

解决方案:这是ProgressBar中的Bug!

终于......我想我找到了解决方案......

这不会像人们期望的那样工作:

bar.setMax(50);
bar.setProgress(20);
bar.setMax(20);
bar.setProgress(20);
Run Code Online (Sandbox Code Playgroud)

如果再次传递相同的值,setProgress(...)似乎不会触发drawable上的更新.但它也不会在setMax期间触发.因此缺少更新.看起来像android ProgressBar中的Bug!这花了我大约8个小时..哈哈:D

为了解决这个问题,我只是在每次更新之前做一个bar.setProgress(0)...这只是一种解决方法,但它对我有用,如预期:

bar.setMax(50);
bar.setProgress(20);
bar.setProgress(0); // <--
bar.setMax(20);
bar.setProgress(20);
Run Code Online (Sandbox Code Playgroud)

  • 可悲的是,即使在4年之后,这仍然是一个错误.仅设置bar.setProgress(0)不起作用. (7认同)
  • 它是非常糟糕的进度条错误... 10个小时找到这个补丁. (3认同)
  • 从那时起它就已存在:http://code.google.com/p/android/issues/detail?id = 12945 (2认同)
  • 4/9/2017问题仍然存在.我在`post`动作中调用了'setProgress`,它似乎现在已经解决了这个问题. (2认同)

dav*_*ola 19

我能够使用它View.post():

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

    // ...

    mSeekBar.post(new Runnable() {
        @Override
        public void run() {
            mSeekBar.setProgress(percentOfFullVolume);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

正如SKT的回答一样,我不清楚为什么这不应该起作用

mSeekBar.setProgress(percentOfFullVolume);
Run Code Online (Sandbox Code Playgroud)

然而,它似乎是真实的,包括Android Lollipop.


SKT*_*SKT 13

您可以使用处理程序进行更新 progressbar

Handler progressBarHandler = new Handler();

ProgressBar bar = (ProgressBar) findViewById(R.id.progressBar1);;

progressBarHandler .post(new Runnable() {

      public void run() {
          bar.setProgress(progress);
      }
});
Run Code Online (Sandbox Code Playgroud)


Far*_*deh 9

对我来说,出于某种原因打电话setMax() 之前 setProgress().


小智 7

在我的情况下,我创建VerticalSeekBar,并且Stuck的解决方案不起作用.几个小时后,我找到了一个解决方案:

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

希望能帮助任何人.


sar*_*nan 5

创建 updateThumb(); VerticalSeekbar 中的方法

public void updateThumb(){
     onSizeChanged(getWidth(), getHeight(), 0, 0);
}
Run Code Online (Sandbox Code Playgroud)

设置进度后调用更新thumb方法。

seekBar.setProgress((int) progress);
seekBar.updateThumb();
Run Code Online (Sandbox Code Playgroud)

它在verticalseekbar cals中对我有用