12

Seekbar在片段中使用 a 并且需要将其移动Seekbar到不同的位置。但是,setProgress(xxx)不工作。

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

4

6 回答 6

19

It's a Bug in ProgressBar!

The setProgress(...) seems to not trigger the update on the drawable if the same value is passed again. But it's not triggered during the setMax, too. So the update is missing.

To solve this, I'm just doing a bar.setProgress(0) before each update... this is only a workaround, but it works for me as expected:

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

Second Option.

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

it may also work for someone.

Try to set max value first and then set the progress.

于 2015-02-10T13:41:15.840 回答
4

我添加了这个答案,因为这可以帮助将来的人。
就我而言,我还认为 setProgress 无法正常工作,但这是我的错误。

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

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

  • 第一个 SeekBar 最大值 = 100。
  • 当您设置进度 > 最大值时,进度 = 最大值。
  • 所以你需要在设置进度值之前设置一个最大值。
于 2015-01-14T03:00:34.957 回答
3

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

我有一个 MainActivity 提交和替换片段,并在每个片段的包内传输SeekBar值。用户更改 Seekbar 的值,并将其进度放入Bundle中。然后当用户切换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 年多了,我什至不明白这个 bug 怎么还能存在,因为它已经被报告了。

于 2017-11-25T16:08:15.430 回答
1

SeekBar.setProgress()应该可以正常工作。你确定你的代码在 UI 线程上执行吗?如果不是,那么这将是显而易见的解释。在 API 文档中查看 ProgressBar 的示例

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

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

于 2013-06-26T07:02:50.237 回答
1

如今,一切似乎都按预期工作。
不再需要发布。
做就是了:

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

(顺序无关紧要)

于 2018-05-17T15:46:41.647 回答
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);
    //...
}
于 2018-03-14T03:41:56.090 回答