How to set seekbar min and max value

Viewed 131235

I have a seekbar and trying to set the value from 60 to 180 for one and 40 to 190 for the second one in step of 1.

sb1 = (SeekBar) findViewById(R.id.progresss);
        sb1.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {       

            @Override       
            public void onStopTrackingTouch(SeekBar seekBar) {      
                // TODO Auto-generated method stub
                //int inVal = Integer.parseInt(String.valueOf(seekBar.getProgress()));
                //inVal =+ 70;
                //Toast.makeText(getApplicationContext(), String.valueOf(inVal),Toast.LENGTH_LONG).show();
            }       

            @Override       
            public void onStartTrackingTouch(SeekBar seekBar) {     
                // TODO Auto-generated method stub      
            }       

            @Override       
            public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {     
                // TODO Auto-generated method stub
                progress =+ 70;
                Toast.makeText(getApplicationContext(), String.valueOf(progress),Toast.LENGTH_LONG).show();

            }       
        });

is not working. Any idea how to fix it?

15 Answers

If you are using the AndroidX libraries (import androidx.preference.*), this functionality exists without any hacky workarounds!

    val seekbar = findPreference("your_seekbar") as SeekBarPreference
    seekbar.min = 1
    seekbar.max = 10
    seekbar.seekBarIncrement = 1

For requirements like this I have created Utility to customize Seekbar progress like below code:

SeekBarUtil.class

   import android.widget.SeekBar;
import android.widget.TextView;

public class SeekBarUtil {

    public static void setSeekBar(SeekBar mSeekbar, int minVal, int maxVal, int intervalVal, final TextView mTextView, String startPrefix, String endSuffix) {

        int totalCount = (maxVal - minVal) / intervalVal;
        mSeekbar.setMax(totalCount);
        mSeekbar.setOnSeekBarChangeListener(new CustomSeekBarListener(minVal, maxVal, intervalVal) {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                //progress = ((int)Math.round(progress/interval))*interval;
                int val = min;
                if (interval == totalCount) {
                    val = max;
                } else {
                    val = min + (progress * interval);
                }
                seekBar.setProgress(progress);
                mTextView.setText(startPrefix + val + endSuffix);
            }
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {  }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {   }
        });

    }
}

and CustomSeekBarListener.class

import android.widget.SeekBar;

class CustomSeekBarListener implements SeekBar.OnSeekBarChangeListener {
    int min=0,max=0,interval=1;
    int totalCount;
    public CustomSeekBarListener(int min, int max, int interval) {
        this.min = min;
        this.max = max;
        this.interval = interval;
        totalCount= (max - min) / interval;
    }
    @Override
    public void onProgressChanged(SeekBar seekBar, int i, boolean b) { }
    @Override
    public void onStartTrackingTouch(SeekBar seekBar) { }
    @Override
    public void onStopTrackingTouch(SeekBar seekBar) { }
}

and you can use it like below code snippet

SeekBarUtil.setSeekBar(seekbarAmountNeeded,10000,200000,5000,textAmount,"$"," PA");

Another solution to handle this case is creating a customized Seekbar, to get ride of converting the real value and SeekBar progress every time:

import android.content.Context
import android.util.AttributeSet
import android.widget.SeekBar

//
// Require SeekBar with range [Min, Max] and INCREMENT value,
// However, Android Seekbar starts from 0 and increment is 1 by default, Android supports min attr on API 26,
// To make a increment & range Seekbar, we can do the following conversion:
//
//     seekbar.setMax((Max - Min) / Increment)
//     seekbar.setProgress((actualValue - Min) / Increment)
//     seekbar.getProgress = Min + (progress * Increment)
//
// The RangeSeekBar is responsible for handling all these logic inside the class.

data class Range(val min: Int, val max: Int, private val defaultIncrement: Int) {
    val increment = if ((max - min) < defaultIncrement) 1 else defaultIncrement
}


internal fun Range.toSeekbarMaximum(): Int = (max - min) / increment


class RangeSeekBar: SeekBar, SeekBar.OnSeekBarChangeListener {

    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)

    var range: Range = Range(0, 100, 1)
        set(value) {
            field = value
            max = value.toSeekbarMaximum()
        }

    var value: Int = 0
        get() = range.min + progress * range.increment
        set(value) {
            progress = (value - range.min) / range.increment
            field = value
        }

    var onSeekBarChangeListenerDelegate: OnSeekBarChangeListener? = this

    override fun setOnSeekBarChangeListener(l: OnSeekBarChangeListener?) {
        onSeekBarChangeListenerDelegate = l
        super.setOnSeekBarChangeListener(this)
    }

    override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
        onSeekBarChangeListenerDelegate?.onProgressChanged(seekBar, value, fromUser)
    }

    override fun onStartTrackingTouch(seekBar: SeekBar?) {
        onSeekBarChangeListenerDelegate?.onStartTrackingTouch(seekBar)
    }

    override fun onStopTrackingTouch(seekBar: SeekBar?) {
        onSeekBarChangeListenerDelegate?.onStopTrackingTouch(seekBar)
    }
}

Then in your fragment,

    // init
    range_seekbar.range = Range(10, 110, 10)
    range_seekbar.value = 20

    // observe value changes
    range_seekbar.userChanges().skipInitialValue().subscribe {
        println("current value=$it")
    }

Keywords: Kotlin, range SeekBar, Rx

You can use Material design sliders instead of seekbar

<com.google.android.material.slider.Slider
    ...
    android:valueFrom="60"
    android:valueTo="180"
    android:stepSize="10.0"  />'

for more check here https://material.io/components/sliders/android

    paySeekRange.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            Debug.i(TAG, "onProgressChanged 1: " + progress);
            int progressMin = (progress * (maxPayRange - minPayRange) / 100) + minPayRange;
            Debug.i(TAG, "onProgressChanged 2: " + progress);
            int progressMax = (progress * (maxPayRange) / 100);
            progress = (progress * (progressMax - progressMin) / 100) + progressMin;
            Debug.i(TAG, "onProgressChanged 3: " + progress);
            txtWeeklyPay.setText("$".concat(String.valueOf(progress)));
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });
Related