安卓SeekBar最小值

88
如何定义SeekBar的最小值?这是在XML布局中完成还是需要以编程方式定义?
基本上,我需要将我的最小值从0更改为0.2。
13个回答

127

如何定义SeekBar的最小值?

您无法定义最小值,它是0

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

当您获取值时,请添加0.2


你也应该调用 setProgress,这样UI上的更改才能反映出来 - 就像Szabolcs Becze在他的答案中演示的那样。 - ban-geoengineering
4
不,你不应该这样做。他的回答与最小值无关。SeekBar代表从0到(max-min)的范围。为了获取调整后的值,您需要将所需的最小值加到实际进度上。由于实际进度已经“反映在UI上”,因此没有什么需要更改的。 - CommonsWare
好的,这取决于您的标签设置方式。我刚刚提供了一个完整的答案,我认为这是唯一正确的方法。https://dev59.com/E3A75IYBdhLWcg3w6Nv8#25239248 - ban-geoengineering
将MIN标签设置为最小值,将MAX标签设置为最大值。在onProgressChanged()方法中,将当前值标签设置为progress+minValue。 - Rahul Rastogi

25

这是我用来获取 SeekBar 最大/最小范围的 android:max 的方法。

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

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

因此,您将获得范围最小值到最小值+最大值

要在XML中设置最大值,请使用max =(desiredMax-min)


2
是的,我认为这是最好的方法。SeekBar的单位只是抽象值。您可以在代码中简单地调整它们以获得实际所需的单位,因此我已经点赞了您的答案。 - David George

11

在Java中,SeekBar对象的最小值必须为0(即不能更改),但这是如何获得所需的外观和性能。

假设您希望min为5,max为100...

因此,您有一个范围为95,所以需要将SeekBar的最大值设置为95

如果您的SeekBar具有UI标签,则将它们设置为 5 (min) 和 100 (max)。

因此,layout XML应该类似于...

<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>

所以现在你可以像这样引入5个更正...

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);
        }
    }
});

使用这种解决方案可以为您的进度条UI提供正确的最小值、最大值和刻度,如果用户将其全部滑向左侧,控件位置不会“跳到”右侧。


9

基本上,我已经加了size+10,这将自动将最小值设置为10,您可以更改您的设置以设置最小值。

@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();

}

6

我的解决方案对我来说很有效:

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

} 

6
在API版本大于或等于26的情况下,您现在可以向SeekBar添加min xml属性:
android:min="0.2"

4

由于SeekBar.getProgress()总是返回整数值,因此您无法在浮点中设置进度。如果SeekBar的值为0,则以下代码将将TextView的值设置为0.2。您可以根据需要更改minimumVal。

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) {

            }
        });

3

1
你可以尝试以这种方式实现:

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) {

        }
    };

1
这是我使用 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()
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接