使用SeekBar和setProgress不会改变seekBar位置

时间:2013-06-26 06:41:43

标签: android android-fragments seekbar

我在片段中使用Seekbar,需要将Seekbar移动到不同的位置。但是,setProgress(xxx)无效。

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

6 个答案:

答案 0 :(得分:13)

这是ProgressBar中的Bug!

如果再次传递相同的值,则setProgress(...)似乎不会触发drawable上的更新。但它也不会在setMax期间触发。因此缺少更新。

要解决这个问题,我只是在每次更新之前做一个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);
        }
    });

它也适用于某人。

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

答案 1 :(得分:3)

我添加这个答案,因为这可以帮助将来的某个人 在我的情况下,我也认为setProgress不能正常工作,但这是我的错误。

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

对于信息进度和maxProgress等于2000和12000.但是当显示SeekBar时,似乎进度为0,因此无法正常工作。
当你知道它时,你必须意识到这一点是非常合乎逻辑的:

  • 首先是SeekBar max = 100.
  • 设置进度时>最大然后进度=最大。
  • 因此您需要在设置进度值之前设置最大值。

答案 2 :(得分:2)

我在这个主题上添加了评论,因为它发生在我身上,花了我几个小时来弄清问题是什么。该错误仍处于活动状态, setProgress ()方法有时无法正常工作。

我有一个MainActivity,它提交并替换 Fragments ,并在每个Fragments的包中传输 SeekBar 值。用户更改Seekbar的值并将其进度放在 Bundle 中。然后,当用户切换片段时,新的获得 SeekBar 进度。

以这种方式传输它非常好,我在第二个片段中的进度变量上总是有正确的值。当我使用 setProgress (theProgressValueTransmitted)方法时出现问题。这仅在我第一次替换第一个片段时才设置 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年了,我甚至不知道这个bug是如何存在的,因为它已被报道。

答案 3 :(得分:1)

SeekBar.setProgress()应该可以正常工作。您确定您的代码是在UI线程上执行的吗?如果没有,那么这将是一个明显的解释。检查API文档中的ProgressBar

示例

https://developer.android.com/reference/android/widget/ProgressBar.html

在那里,他们展示了如何将执行带回主线程。

答案 4 :(得分:1)

现在一切似乎都按预期工作了 不再需要发布。
只是做:

seekBar.setMax(200);
seekBar.setProgress(50);

(顺序并不重要)

答案 5 :(得分: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);
    //...
}