如何dynamic改变进度条背景android的颜色

我想dynamic更改android中的进度条的背景颜色。 我在本教程的页面末尾附加了“奖励”部分:

http://colintmiller.com/2010/10/how-to-add-text-over-a-progress-bar-on-android/

它改变颜色,但只有一次。 如果多次调用,进度条消失。 这是代码。

这里是进度条定义:

<ProgressBar android:id="@+id/progress_bar" android:layout_width="fill_parent" android:layout_height="wrap_content" style="@android:style/Widget.ProgressBar.Horizontal" android:layout_marginRight="5dp" /> 

这是res / drawable / green_progress.xml中的可绘制定义:

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/background"> <shape> <corners android:radius="5dip" /> <gradient android:startColor="#ff9d9e9d" android:centerColor="#ff5a5d5a" android:centerY="0.75" android:endColor="#ff747674" android:angle="270" /> </shape> </item> <item android:id="@android:id/secondaryProgress"> <clip> <shape> <corners android:radius="5dip" /> <gradient android:startColor="#80ffd300" android:centerColor="#80ffb600" android:centerY="0.75" android:endColor="#a0ffcb00" android:angle="270" /> </shape> </clip> </item> <item android:id="@android:id/progress"> <clip> <shape> <corners android:radius="5dip" /> <gradient android:startColor="@color/greenStart" android:centerColor="@color/greenMid" android:centerY="0.75" android:endColor="@color/greenEnd" android:angle="270" /> </shape> </clip> </item> </layer-list> 

Ene条目rex / values / colors.xml:

 <color name="greenStart">#ff33dd44</color> <color name="greenMid">#ff0A8815</color> <color name="greenEnd">#ff1da130</color> 

最后,在代码中:

 m_bar.setProgressDrawable(getResources().getDrawable(R.drawable.green_progress)); 

再一次,问题是它是第一次运作,但随后使酒吧消失。

Related of "如何dynamic改变进度条背景android的颜色"

请参阅Android ProgressBar.setProgressDrawable只能使用一次? 答案如下:

我发现的是drawable在调用setprogressdrawable时不知道它的大小。 它最初设置时,它确实知道它的大小。 这意味着有一个新的drawbar设置到seekbar,但drawable的大小是0,你什么都看不到。

解决的办法是首先获取当前drawable的边界,然后设置新的drawable,最后再设置边界:

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

那么,对于任何正在寻找如何编程的人来说:

  Drawable bckgrndDr = new ColorDrawable(Color.RED); Drawable secProgressDr = new ColorDrawable(Color.GRAY); Drawable progressDr = new ScaleDrawable(new ColorDrawable(Color.BLUE), Gravity.LEFT, 1, -1); LayerDrawable resultDr = new LayerDrawable(new Drawable[] { bckgrndDr, secProgressDr, progressDr }); resultDr.setId(0, android.R.id.background); resultDr.setId(1, android.R.id.secondaryProgress); resultDr.setId(2, android.R.id.progress); progressBar.setProgressDrawable(resultDr); 

设置可绘制的ID是至关重要的,并保留进度条的边界和​​实际状态