ProgressBar.setProgressDrawable在Android 2.3上无法正常工作

8

我目前正在使用一个动态更新的 ProgressBar。在特定的百分比下,进度条会设置不同颜色的可绘制对象。我们目前已在可绘制 xml 文件中定义了各种不同颜色的剪辑可绘制对象。其中标为 progressbar_blue_states 的对象详细说明如下:

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

  <item android:id="@android:id/background"
      android:drawable="@drawable/progressbar_grey">
  </item>

  <item android:id="@android:id/progress">
      <clip android:drawable="@drawable/progressbar_blue" />
  </item>
</layer-list>

每当我们需要更新对话框时,就调用以下代码:
progressBar.setProgressDrawable(getResources().getDrawable(R.drawable.progressbar_blue_states));

然而,这种方法不仅不能更新ProgressBar,还会将进度条完全取出,留下空白。但是,如果我在xml中设置android:progressDrawable="@drawable/progressbar_blue_states"并删除setProgressDrawable()调用,它就能正确加载。我们需要setProgressDrawable来根据需要更新颜色。
在Android 4.0+中,该调用正常工作,但在Android 2.3中,我们遇到了一些问题。有什么想法吗? 编辑 以下是我们在xml中设置ProgressBar的方式:
<ProgressBar android:id="@+id/progress"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_marginBottom="2dp"
            android:indeterminate="false"
            android:indeterminateOnly="false"
            android:progress="24"
            android:max="100"
            android:progressDrawable="@drawable/progressbar_red_states" />

你尝试更新 progressbar_blue 的边界值,将其设置为进度绘制时了吗? - user
你是指设置进度量吗?如果是的话,我们会在设置可绘制对象后立即执行该操作。 - jbenowitz
如果您指的是布局边界,请在XML中进行设置,我已经添加了上面的内容。 - jbenowitz
1
不,我指的是可绘制对象的边界(从4.0开始实现)。像这样:Drawable newDr = getResources().getDrawable(R.drawable.progressbar_blue_states); newdr.setBounds(0, 0, progressbar.getWidth() - progressbar.getPaddingLeft() - progressbar.getPaddingRight(), progressbar.getHeight() - progressbar.getPaddingTop() -progressbar.getPaddingBottom()); progressbar.setProgressDrawable(newDr); - user
1
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/26654/discussion-between-jbenowitz-and-luksprog - jbenowitz
显示剩余4条评论
2个回答

9

我遇到了同样的bug,但是通过使用这个答案解决了。

这意味着一个新的可拖动条的绘制设置已经完成,但是绘制的大小为0,所以你看不到任何东西。

Rect bounds = mySeekBar.getProgressDrawable().getBounds();
mySeekBar.setProgressDrawable(newSeekBarBackground);
mySeekBar.getProgressDrawable().setBounds(bounds);

谢谢!我遇到了同样的问题,这就是解决办法。 - ssawchenko

4
根据这篇文章https://dev59.com/W1nUa4cB1Zd3GeqPdsjg#6953534,一个好的解决方案是将进度(progress)设置为1;重新设置最大进度(max progress),然后设置真实进度。
progressBar.setProgressDrawable(...);
progressBar.setProgress(1);
progressBar.setMax(maxProgress);
progressBar.setProgress(progress);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接