最小值

如何定义 SeekBar 的最小值?这是在 XML 布局中完成的,还是需要以编程方式定义它?

基本上我需要把我的最小值从0改为0.2

87665 次浏览

How to define a SeekBar's minimum value?

You can't define the minimum value. It is 0.

Basically I need to change my minimum value from 0 to 0.2

When you get the value, add 0.2 to it.

Basically I have added the size+10 which will automatically set the min to 10 you can change yours to set it which min. value.

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
int siz = size + 10;
txtViewFontSize.setTextSize(siz);


Toast.makeText(this, String.valueOf(siz), Toast.LENGTH_SHORT).show();


}

I created this simple library, it's not much, but it can save you some time.

https://github.com/joaocsousa/DoubleSeekBar

My solution which works fine for me is:

    @Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (progress <= SOME_LIMIT) {
seekBar.setProgress(SOME_LIMIT);
} else {
// DO SOMETHING
}


}

Here is what I use to get android:max for a max/min range for a SeekBar.

mSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
int progressChanged = minimumValue;


public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
progressChanged = minimumValue+ progress;
}
});

So you will get the range minimum to minimum+max;

To set the max value in xml, use max=(desiredMax-min);

The min value must be 0 for the SeekBar object in Java (i.e., it cannot be changed), but this is how to get the required look and performance.

Suppose you want your min to be 5 and your max to be 100...

Therefore, you have a range of 95, so you would need to set up the SeekBar with a maximum value of 95.

If your seekbar has UI labels, you would make them 5 (min) and 100 (max).

So, the layout XML would be something like...

<LinearLayout
android:id="@+id/sampleSizeLayout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/batchDurationSecsLayout"
android:orientation="vertical"
android:visibility="visible" >


<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/sample_size" />


<SeekBar
android:id="@+id/sampleSizeSeekBar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:max="95" />


<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="visible" >


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:gravity="left"
android:text="5" />


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:gravity="right"
android:text="100" />


</RelativeLayout>


</LinearLayout>

So now you can introduce the 5 correction, like this...

final SeekBar sampleSizeSeekBar = (SeekBar)findViewById(R.id.sampleSizeSeekBar);
final int sampleSizeSeekBarCorrection = 5; //e.g., 95 <--> 100
int realValueFromPersistentStorage = appObj.getSampleSize(); //Get initial value from persistent storage, e.g., 100
sampleSizeSeekBar.setProgress(realValueFromPersistentStorage - sampleSizeSeekBarCorrection); //E.g., to convert real value of 100 to SeekBar value of 95.
sampleSizeSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {


int val = sampleSizeSeekBar.getProgress();


public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
val = progress + sampleSizeSeekBarCorrection; //e.g., to convert SeekBar value of 95 to real value of 100
}


public void onStartTrackingTouch(SeekBar seekBar) {
}


public void onStopTrackingTouch(SeekBar seekBar) {
try {
appObj.saveSampleSize(val); //Save real value to persistent storage, e.g., 100
appObj.makeToast("Sample size set to " + val);
}
catch(Exception e) {
Log.e(LOG_TAG, "Error saving sample size", e);
appObj.makeToast("Error saving sample size: " + e);
}
}
});

This solution will give your seekbar the correct min, max and scale on the UI, and the position of the control won't 'jump' to the right if the user slides it all the way to the left.

You can not set progress in float because seekbar.getProgress() always returns integer value. Following code will set textview value to 0.2 if seekbar value is 0. you can change minimumVal according to your requirement.

int minimumVal = 0;


seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {




if (progress >= minimumVal) {
seekBar.setProgress(progress);
textView.setText(progress);
} else {
seekBar.setProgress(minimumVal);
textView.setText("0.2");
}
}


@Override
public void onStartTrackingTouch(SeekBar seekBar) {


}


@Override
public void onStopTrackingTouch(SeekBar seekBar) {


}
});

You can try doing this way:

int yourMinProgress = 10;

private SeekBar.OnSeekBarChangeListener onSeekBarChangeListener =
new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {


if (progress < yourMinProgress) {
seekBar.setProgress(10);
}
}


@Override
public void onStartTrackingTouch(SeekBar seekBar) {


}


@Override
public void onStopTrackingTouch(SeekBar seekBar) {


}
};

this code works for me fine!!!

SeekBar seekBar = (SeekBar)findViewById(R.id.seekBar);
seekBar.setMax(100);
seekBar.setProgress(40);
seekBar.setOnSeekBarChangeListener(seekBarChangeListener);


SeekBar.OnSeekBarChangeListener seekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {
if(progress <= 40){
seekBar.setProgress(40);
}
if(progress >= 40) {
pgr_status.setText(String.valueOf(progress));
}
}


@Override
public void onStartTrackingTouch(SeekBar seekBar) {


}


@Override
public void onStopTrackingTouch(SeekBar seekBar) {


}
};

In api versions >=26 you can now add min xml attribute to SeekBar:

android:min="0.2"

I finally found a way to set seekBar minimum value, just set set your setOnSeekBarChangeListener like this:

int minimumValue = 10; // your minimum value
seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
// you can set progress value on TextView as usual
txtProgress.setText(String.valueOf(progress));


}


@Override
public void onStartTrackingTouch(SeekBar seekBar) {


}


@Override
public void onStopTrackingTouch(SeekBar seekBar) {
if(seekBar.getProgress() < minimumValue)
seekBar.setProgress(minimumValue);


}
});

Hope this helps :)

Here is how i did this with Kotlin:

view.controlTextSize.setOnClickListener {


textSizeControl.textSizeControlSlider.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{


override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
var progress = progress
if (progress < 10){
progress = 10
seekBar?.progress = progress
}


view.content.textSize = progress.toFloat()
prefs.edit().putFloat("ContentTextSize", progress.toFloat()).apply()
}


override fun onStartTrackingTouch(seekBar: SeekBar?) {}


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

If you are using com.android.support:preference-v7, SeekBarPreference already has a method setMin(int).

Just call that in onCreatePreferences() of your PreferenceFragmentCompat.

XML values will still be ignored on API < 26 but setting it programatically, works.