使用SeekBar和setProgress无法改变SeekBar的位置

12

我在一个片段中使用了Seekbar,需要将Seekbar移动到不同的位置,但是setProgress(xxx)没有起作用。

如何以编程方式触发此方法以控制Seekbar: public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)? 手动移动Seekbar可以正常工作。

6个回答

23

ProgressBar 中存在一个 Bug!

setProgress(...) 函数似乎在再次传递相同值时不会触发 drawable 的更新。但是在设置最大值时也不会触发更新,所以造成了更新缺失。

为了解决这个问题,我只是在每次更新之前执行了 bar.setProgress(0),这只是一个临时的解决方法,但对于我来说效果很好:

bar.setProgress(0); // call these two methods before setting progress.
bar.setMax(20);
bar.setProgress(20);

第二个选项。

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

对于某些人来说,它可能也有效。

先尝试设置最大值,然后再设置进度。


Husnain Iqbal,你可以使用postDelayed方法的第二种方式,并将延迟时间设置为100。这样它会更快地工作。 - Zar E Ahmer
它对我不起作用 :( - Husnain Iqbal
我找到了解决方案 :) 在setOnSeekBarChangeListener中,在onProgressChanged()方法内调用seekBar.setProgress(progress),并在onStopTrackingTouch()方法内调用剩余的方法。谢谢。 - Husnain Iqbal
4
第二个方法对我起作用了。我很惊讶这个bug在2018年仍然存在。 - DoruChidean
这意味着在Android SDK中已经修复了该漏洞。 - Zar E Ahmer
显示剩余2条评论

4

我添加这个答案是为了帮助未来的某个人。
在我的情况下,我也认为setProgress没有正常工作,但这是我的错误。

increaseIncomeSeekBar.setProgress(progress);
increaseIncomeSeekBar.setMax(maxProgress);

关于 info 的进度和最大进度均为 2000 和 12000。但是在显示 SeekBar 时,似乎进度为 0,因此无法正常工作。
你必须要知道这一点,当你了解它的逻辑时就很容易理解:

  • 首先,SeekBar max 值为 100。
  • 当你设置一个进度值大于 max 时,进度值将会被设定为 max。
  • 所以在设置进度值之前,需要先设置一个 max 值。

问题已解决。 :) - payne

3
我在这个主题下添加评论,因为我也遇到了这个问题,并花费了几个小时才找出问题所在。这个错误仍然存在,setProgress()方法有时不起作用。
我有一个MainActivity,它提交和替换Fragments并将SeekBar值传递给每个Fragment的bundle。用户更改SeekBar的值,并将其进度放入Bundle中。然后,当用户切换Fragment时,新的Fragment会获取SeekBar进度。
这种方式传递是完全有效的,第二个Fragment中我的进度变量始终具有正确的值。问题出现在我使用setProgress(theProgressValueTransmitted)方法时。这只在我第一次替换第一个Fragment时设置了我的SeekBar进度。之后,它永远不会改变,而进度值仍然是正确的。
我使用了:
int seekBarProgress;
Bundle bundle = this.getArguments();
    if (bundle != null) {
        seekBarProgress = bundle.getInt("seekBarProgress");
    mySeekBar.post(new Runnable() {
                @Override
                public void run() {
                    eventListTimeSeekBar.setProgress(seekBarProgress);

                }
            });
    }

这是我能使它正常工作的唯一方法,希望对有同样问题的人有所帮助。此帖子已经超过4年了,我甚至不理解为什么这个错误还存在,因为它已经被报告。


1
现在,所有的事情似乎都按预期运行。
不再需要发布邮件了。
只需执行:
seekBar.setMax(200);
seekBar.setProgress(50);

(顺序无关紧要)


1

谢谢您的回复。我没有使用过线程,所以我不确定它是否在UI线程上执行。我会去研究一下。 - sowens

0

大多数情况下,SeekBar运行良好。但有时候会出现问题。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    //...
    seekBar.setProgress(value);
    //...
}

在我使用detach() + attach()刷新片段视图后,代码无法正常工作。我的解决方案是在onViewStateRestored()中应用setProgress()。

@Override
public void onViewStateRestored(Bundle inState) {
    //...
    seekBar.setProgress(value);
    //...
}

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