32

I want the SeekBar progress to change whenever I click a button. Using setProgress() works only for initial value. It throws an error if I use it after some changes.

Suragch
  • 484,302
  • 314
  • 1,365
  • 1,393
shiva
  • 463
  • 2
  • 7
  • 9

10 Answers10

36

Perhaps you should try to use a handler? I use this in an app of mine and works fine.

1) When creating your SeekBar:

// ...
seekBarHandler = new Handler(); // must be created in the same thread that created the SeekBar
seekBar = (SeekBar) findViewById(R.id.my_seekbar);
// you should define max in xml, but if you need to do this by code, you must set max as 0 and then your desired value. this is because a bug in SeekBar (issue 12945) (don't really checked if it was corrected)
seekBar.setMax(0);
seekBar.setMax(max);
seekBar.setProgress(progress);
// ...

2) When your button is clicked

// ...
seekBarHandler.post(new Runnable() {
    @Override
    public void run() {
        if (seekBar != null) {
            seekBar.setMax(0);
            seekBar.setMax(max);
            seekBar.setProgress(newProgress);
        }
    }
});
// ...
PFROLIM
  • 1,194
  • 9
  • 11
  • 1
    Why are you calling setMax(int) twice? Seems the second one just nullifies the first one. – Alyoshak Nov 08 '16 at 16:39
  • "this is because a bug in SeekBar (issue 12945) (don't really checked if it was corrected)" – PFROLIM Nov 09 '16 at 17:42
  • This solution does not work for me. setting the max to zero and then to the desired value before setting progress has no effect. Call to setProgress() still does not work. – Alyoshak Dec 26 '18 at 21:04
8

Try this :

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

instead of :

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

Only if you set the Max Value first, can the SeekBar get an idea of how much progress is actually made, when you set the progressValue.

This actually made a difference for me when I wanted a default value for my Progress Bar

shellym
  • 546
  • 1
  • 5
  • 11
4

You can also use :

mSeekBar.refreshDrawableState();

after you set progress .

Jesus Dimrix
  • 4,378
  • 4
  • 28
  • 62
2

As of support library 28.0.0 anyway, I can set the progress simply like this

mySeekBar.setProgress(17);

and the position gets updated without a problem.

Suragch
  • 484,302
  • 314
  • 1,365
  • 1,393
1

You need to call setOnSeekbarChangeListener() on your seekbar object and let for example your activity implement OnSeekbarChangeListener() and in that function you can do whatever you want.

Rob Kielty
  • 7,958
  • 8
  • 39
  • 51
similuke
  • 11
  • 1
1

The solution that works for me:

mSeekbaBar.setProgress(progress);
mSeekbaBar.post(new Runnable() {
            @Override
            public void run() {
                mSeekbaBar.setProgress(progress);
            }
        });

It removes the blinking of the thumb

Mahmoud
  • 2,683
  • 1
  • 30
  • 32
1

Update Seekbar with coroutines delay

lifecycleScope.launch(Dispatchers.Main) {
            delay(100)
            getViewDataBinding()!!.seekBar.progress = it?.position?.toInt() ?: 0
        }
Mohd Danish
  • 186
  • 2
  • 3
0

I've just been tinkering with the seek Bar on My App....

In Order to the seekBar to Change while you are in the Activity you need to Call the method setProgress(), and pass it a boolean animate value.

Like this:

seekBar.setProgress(int valueOfProgress, bool animate)
raz amsily
  • 11
  • 1
  • I think the problem is related to setting the progress of the seek bar something greater than its max value. – aytek Dec 23 '20 at 13:53
0

I was also facing the same issue. I used coroutines to fix it:

lifecycleScope.launch(Dispatchers.Main) {
    seekBar.progress = level
}
Jazib Khan
  • 408
  • 4
  • 13
0

I had the same problem. Calling the onChangeListener() only when fromUser is true helped:

private class MyListener implements SeekBar.OnSeekBarChangeListener {
          public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {
                   if(fromUser){ 
                        ..... 
                   }
          }
    
          public void onStartTrackingTouch(SeekBar seekBar) {}
    
          public void onStopTrackingTouch(SeekBar seekBar) {}
}