Android ProgressBar.setProgressDrawable仅可使用一次?

12
在一个颜色选择器中,我有三个拖动条用于调整色相(Hue)、饱和度(Saturation)和明度(Value)。在这些 SeekBar 上调用 setProgressDrawable 只能在 onCreate 中初始化时生效,当用户更新 Hue SeekBar 时,我希望调用 setProgressDrawable 来为 Saturation 和 Value SeekBars 显示用户新的颜色选择。
但是,在 onCreate 后,所有对 setProgressDrawable 的调用都会导致 SeekBar 被清空。
我该如何根据用户输入更新我的 SeekBars 的背景渐变?
2个回答

43

我发现的是,当调用setprogressdrawable时,可绘制对象不知道自己的大小。当它最初设置时,它确实知道自己的大小。这意味着有一个新的可绘制对象设置到了SeekBar上,但它的大小为0,所以你看不到任何东西。

解决方案是先获取当前可绘制对象的边界,然后设置新的可绘制对象,最后再次设置边界:

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

1
这个问题与我遇到的类似但略有不同。请参见http://stackoverflow.com/questions/6336939/seekbar-drawable-not-drawn-after-being-reused-by-adapter。在此添加评论以帮助将来的某个人。 - Steve Prentice
2
为了让它对我起作用,我按照你说的做了,并添加了以下内容: mySeekBar.setProgress(mySeekBar.getProgress()+1); mySeekBar.setProgress(mySeekBar.getProgress()-1); 这样做可以强制移动,但保持在同一位置。 - Derzu
为了让它在我这里工作,我设置 XML 中的进度等于最大值:android:max="500" android:progress="500" - Rick
如果您的进度条是不确定的,则应调用setIndeterminateDrawable而不是setProgressDrawable - GabrielOshiro

1

嗨,我有解决方案,你首先必须通过调用setProgresssDrawable(drawable)将drawable设置为ProgressBar,然后才能设置值,而不是相反。那会起作用的。

要设置进度可绘制对象:

使用像这样的drawable xml文件:

<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="#00CCCC"
            android:centerColor="#00CCCC" android:centerY="0.75"
            android:endColor="#00CCCC" android:angle="270" />
    </shape>
</item>
<item android:id="@android:id/secondaryProgress">
    <clip>
        <shape>
            <corners android:radius="5dip" />
            <gradient android:startColor="#00CCCC"
                android:centerColor="#00CCCC" android:centerY="0.75"
                android:endColor="#00CCCC" android:angle="270" />
        </shape>
    </clip>
</item>
<item android:id="@android:id/progress">
    <clip>
        <shape>
            <corners android:radius="5dip" />
            <gradient android:startColor="#00CCCC" android:centerColor="#00CCCC"
                android:centerY="0.75" android:endColor="#00CCCC" android:angle="270" />
        </shape>
    </clip>
</item>

将此保存到您的 /drawable 文件夹中,并在 setProgressDrawable(drawable) 函数中使用它


我该如何设置进度条Drawable的渐变色? - michael
我已经在上面回答了你的问题! - Gooner
1
抱歉,这个解决方案并没有解决原帖的问题。请查看toneffectory的答案。 - Jack BeNimble
1
这可能没有帮助到楼主,但肯定帮助了我。 - dmon

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