52

我有一个搜索栏,在移动它时我想将值从 0 更改为 200。我有一个 TextView,在移动搜索栏时我会在其中显示这些值。但我不想拥有该区间的每个值(0,1,2,3,4,5...),而是拥有 10、20、30...等等。所以当我移动搜索栏时,我想显示 10,20,30,40.... 到 200。有人可以给我一个提示或示例如何执行此操作吗?

4

8 回答 8

119

试试下面的代码

SeekBar seekBar = (SeekBar)layout.findViewById(R.id.seekbar);
seekBar.setProgress(0);
seekBar.incrementProgressBy(10);
seekBar.setMax(200);
TextView seekBarValue = (TextView)layout.findViewById(R.id.seekbarvalue);
seekBarValue.setText(tvRadius.getText().toString().trim());

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        progress = progress / 10;
        progress = progress * 10;
        seekBarValue.setText(String.valueOf(progress));
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
});

setProgress(int)用于设置搜索栏的起始值

setMax(int)用于设置搜索栏的最大值

如果要设置搜索栏的边界,则可以检查 onProgressChanged方法中的进度条值。如果进度小于或大于边界,则可以将进度设置为您定义的边界。

于 2011-09-07T05:33:04.583 回答
18

我能想到的最简单的方法就是定义:

SeekBar yourSeekBar = (SeekBar)findViewById(R.id.yourSeekBarId);
yourSeekbar.setMax(20);

接下来,覆盖这些方法(空方法也是必需的,即使它们是空的):

yourSeekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {          
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            if (fromUser) {
                if (progress >= 0 && progress <= sizeSeekBar.getMax()) {                        

                    String progressString = String.valueOf(progress * 10);
                    yourTextView.setText(progressString); // the TextView Reference
                    seekBar.setSecondaryProgress(progress);
                }
            }

        }
    });

这个想法是只为搜索栏定义 20 个值,但总是将该值乘以 10 并显示该值。如果你真的不需要 200 个值,那么使用 200 个值是没有意义的。

于 2012-06-24T18:06:50.777 回答
12

您可以使用Material Components LibrarySlider提供的属性:android:stepSize

    <com.google.android.material.slider.Slider
        android:valueFrom="0"
        android:valueTo="200"
        android:stepSize="10"
       ..>

在此处输入图像描述

于 2020-06-01T17:00:06.353 回答
3

您应该使用SeekBar.OnSeekBarChangeListener来跟踪进度更改。打电话mseek.setMax(200)。对当前值进行模运算来决定是否应该更新文本视图。

SeekBar.OnSeekBarChangeListener() {

    void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if (progress % 10 == 0) {
            textview.setText(""+progress);
        }
    }
}
于 2011-09-07T05:28:59.870 回答
2

您还可以通过定义自定义 SeekBar 类来实现这一点,如下所示

public class CustomSeekBar extends AppCompatSeekBar {


int SEEKBAR_MULTIPLIER = 1;

public CustomSeekBar(Context context) {
    super(context);
}

public CustomSeekBar(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public CustomSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

public void setSeekBarConfig( int SEEKBAR_MULTIPLIER, int SEEKBAR_MAX){
    setMax(SEEKBAR_MAX);
    this.SEEKBAR_MULTIPLIER = SEEKBAR_MULTIPLIER;
}

@Override
public int getProgress() {
    return super.getProgress() * SEEKBAR_MULTIPLIER;
}
}

并且可以通过以下方式使用

 CustomSeekBar mCustomSeekBar = (CustomSeekBar) findViewById(R.id.customSeekBar);
 mSeekBar.setSeekBarConfig(10,20);

在 xml 你应该添加 CustomSeekBar 而不是 SeekBar

<*.CustomSeekBar
    com.quemb.qmbform.view:setSeekBarConfig="10"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/seekBar" />

这样您就可以在整个 App 中重复使用自定义的 seekBar,而无需重复整个额外的计算。

于 2017-09-09T06:56:50.387 回答
0

对于最小问题,您可以设置进度偏移量。这样,用户就不会低于您的最小值。

int offset = 10;

seekBar seekBar = (SeekBar)layout.findViewById(R.id.seekbar);
seekBar.setProgress(0);
seekBar.setMax(190); //with the offset, you need to adapt the max value
TextView seekBarValue = (TextView)layout.findViewById(R.id.seekbarvalue);
seekBarValue.setText(""+(seekBar.getProgress() + offset));

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        progress += offset;

        seekBarValue.setText(String.valueOf(progress));
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
});
于 2016-01-14T11:40:13.327 回答
0

使用 Math.round 函数

fun round(n: Int): Int {
    // Smaller multiple
    val a = n / 10 * 10
    // Larger multiple
    val b = a + 10
    // Return of closest of two
    return if (n - a > b - n) b else a
}
于 2018-07-10T11:43:03.383 回答
0

一种可能的解决方案是设置seekBar.setMax(20)(或android:max="20"在 XML 中),并且每当您使用或显示该值时,将其乘以 10。

然后,SeekBar 似乎一次至少移动 20 个。

于 2019-07-01T21:14:39.740 回答