【问题标题】:How to set seekbar min and max value如何设置搜索栏的最小值和最大值
【发布时间】:2014-01-12 18:16:53
【问题描述】:

我有一个搜索栏,并尝试将第一个的值设置为 60 到 180,将第二个的值设置为 40 到 190。

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

            }       
        });

不工作。知道如何解决吗?

【问题讨论】:

  • 检查this
  • 试试this
  • 最小值始终为 0。您无法更改。

标签: java android seekbar


【解决方案1】:

您可以使用 Material design 滑块代替搜索栏

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

更多信息请点击此处https://material.io/components/sliders/android

【讨论】:

    【解决方案2】:

    您可以使用以下代码为搜索栏设置最大值:

        sb1.setMax(100);
    

    这将为您的搜索栏设置最大值。

    但是你不能设置最小值,但是你可以做一些算术来调整值。 使用算术调整您的应用程序所需的值。

    例如,假设您想要从 -50 到 100 的数据值 显示在 SeekBar 上。将 SeekBar 的最大值设置为 150 (100-(-50)), 然后从原始值中减去 50 以获得设置时应使用的数字 酒吧位置。

    您可以通过此link 获取更多信息。

    【讨论】:

    • 完美。这应该在顶部
    • 这是这个问题的最佳答案
    • 虽然这个答案对于Max 值是正确的,但它并没有像MinMax 所说的那样回答问题,所以在提供全面的解决方案之前不要投票!
    • 从 API 级别 26 开始,您可以像这样使用它sb1.setMin(40)
    【解决方案3】:
        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) {
    
            }
        });
    

    【讨论】:

    • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    【解决方案4】:

    对于这样的要求,我创建了实用程序来自定义 Seekbar 进度,如下代码:

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

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

    你可以像下面的代码 sn-p 一样使用它

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

    【讨论】:

      【解决方案5】:

      如果您使用的是AndroidX libraries (import androidx.preference.*),则无需任何变通办法即可使用此功能!

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

      【讨论】:

        【解决方案6】:

        您无法设置 SeekBar 的 min 值(始终为 0),也无法设置 SeekBar 的 step 值(始终为 1)。

        要将值从 60 设置为 180,步长为 1

        int step = 1;
        int max = 180;
        int min = 60;
        
        // Ex : 
        // If you want values from 3 to 5 with a step of 0.1 (3, 3.1, 3.2, ..., 5)
        // this means that you have 21 possible values in the seekbar.
        // So the range of the seek bar will be [0 ; (5-3)/0.1 = 20].
        seekbar.setMax( (max - min) / step );
        
        
        seekbar.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) 
                {
                    // Ex :
                    // And finally when you want to retrieve the value in the range you
                    // wanted in the first place -> [3-5]
                    //
                    // if progress = 13 -> value = 3 + (13 * 0.1) = 4.3
                    double value = min + (progress * step);
        
                }
            }
        );
        

        我在代码中放了另一个例子,以便你理解数学。

        【讨论】:

        • 什么都不会太迟,感谢您发布您的解决方案。我现在更好理解了:)
        • 这应该是公认的答案。更容易理解!
        • 非常好的解决方案
        • 这是最好的答案
        • 我称之为解决问题的程序化方式。很好的解决方案。
        【解决方案7】:

        处理这种情况的另一个解决方案是创建一个自定义的 Seekbar,以便每次转换实际值和 SeekBar 进度:

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

        然后在你的片段中,

            // init
            range_seekbar.range = Range(10, 110, 10)
            range_seekbar.value = 20
        
            // observe value changes
            range_seekbar.userChanges().skipInitialValue().subscribe {
                println("current value=$it")
            }
        

        关键字:Kotlin、范围 SeekBar、Rx

        【讨论】:

          【解决方案8】:
              private static final int MIN_METERS = 100;
              private static final int JUMP_BY = 50;
          
              metersText.setText(meters+"");
              metersBar.setProgress((meters-MIN_METERS));
              metersBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                  @Override
                  public void onStopTrackingTouch(SeekBar seekBar) {
                      // TODO Auto-generated method stub
                  }
                  @Override
                  public void onStartTrackingTouch(SeekBar seekBar) {
                      // TODO Auto-generated method stub
                  }
                  @Override
                  public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {
                      progress = progress + MIN_METERS;
                      progress = progress / JUMP_BY;
                      progress = progress * JUMP_BY;
                      metersText.setText((progress)+"");
                  }
              });
          }
          

          【讨论】:

            【解决方案9】:

            在 seekbar 中没有设置最小值或最大值的选项,因此您可以在此处使用公式来缩放您的值。

            Desired_value = ( progress * ( Max_value - Min_value) / 100 ) + Min_value
            

            我已经在很多例子中测试了这个公式。在你的例子中, 如果 progressBar 是中间值(即 progress = 50 )并且您的 Min_val 和 Max_val 分别为 60 和 180,那么这个公式将为您提供 Desired_value '120'。

            【讨论】:

              【解决方案10】:

              对我来说,为搜索栏设置最小值和最大值的最简单方法是:如果您希望值 min=60 到 max=180,则等于 min=0 max=120。所以在你的 seekbar xml 设置属性中:

              android:max="120"
              

              min 将始终为 0

              现在您只需要做您正在做的事情,添加金额即可在任何更改中获得您的翻译价值,在本例中为 +60。

                  seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                      @Override
                      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                          int translatedProgress = progress + 60;
                      }
              
                      @Override
                      public void onStartTrackingTouch(SeekBar seekBar) {
                      }
              
                      @Override
                      public void onStopTrackingTouch(SeekBar seekBar) {
                      }
                  });
              

              注意搜索栏属性 android:progress,如果更改范围,则必须重新计算初始进度。如果你想要 50%,max/2,在我的例子中 120/2 = 60;

              【讨论】:

                【解决方案11】:

                最小值总是从零开始,你对此无能为力。但是当用户开始滚动它时,您可以更改它的值。

                这里我将最大值设置为 64。 这个计算很简单:我希望用户从 15 分钟到 16 小时选择一个时间,他每 15 分钟到 16 小时选择一个,清楚吗?我知道,很简单:)

                    SeekBar seekBar = (SeekBar) dialog.findViewById(R.id.seekBar);
                    seekBar.setMax(64);
                
                    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                        float b;
                
                        @Override
                        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                            float des = (float) progress / 4;
                            b = des;
                            hours.setText(des + " hours");
                        }
                
                        @Override
                        public void onStartTrackingTouch(SeekBar seekBar) {
                
                
                        }
                
                        @Override
                        public void onStopTrackingTouch(SeekBar seekBar) {
                            hoursSelected = b;
                        }
                    });
                

                【讨论】:

                  【解决方案12】:

                  复制这个类并使用自定义搜索栏:

                  public class MinMaxSeekBar extends SeekBar implements SeekBar.OnSeekBarChangeListener {
                  private OnMinMaxSeekBarChangeListener onMinMaxSeekBarChangeListener = null;
                  private int intMaxValue = 100;
                  private int intPrgress = 0;
                  private int minPrgress = 0;
                  
                  
                  public int getIntMaxValue() {
                      return intMaxValue;
                  }
                  
                  public void setIntMaxValue(int intMaxValue) {
                      this.intMaxValue = intMaxValue;
                      int middle = getMiddle(intMaxValue, minPrgress);
                      super.setMax(middle);
                  }
                  
                  public int getIntPrgress() {
                      return intPrgress;
                  }
                  
                  public void setIntPrgress(int intPrgress) {
                      this.intPrgress = intPrgress;
                  }
                  
                  public int getMinPrgress() {
                      return minPrgress;
                  }
                  
                  public void setMinPrgress(int minPrgress) {
                      this.minPrgress = minPrgress;
                      int middle = getMiddle(intMaxValue, minPrgress);
                      super.setMax(middle);
                  }
                  
                  private int getMiddle(int floatMaxValue, int minPrgress) {
                      int v = floatMaxValue - minPrgress;
                      return v;
                  }
                  
                  public MinMaxSeekBar(Context context, AttributeSet attrs) {
                      super(context, attrs);
                      this.setOnSeekBarChangeListener(this);
                  }
                  
                  public MinMaxSeekBar(Context context) {
                      super(context);
                      this.setOnSeekBarChangeListener(this);
                  }
                  
                  @Override
                  public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                      intPrgress = minPrgress + i;
                      onMinMaxSeekBarChangeListener.onMinMaxSeekProgressChanged(seekBar, intPrgress, b);
                  }
                  
                  @Override
                  public void onStartTrackingTouch(SeekBar seekBar) {
                      onMinMaxSeekBarChangeListener.onStartTrackingTouch(seekBar);
                  
                  }
                  
                  @Override
                  public void onStopTrackingTouch(SeekBar seekBar) {
                      onMinMaxSeekBarChangeListener.onStopTrackingTouch(seekBar);
                  }
                  
                  public static interface OnMinMaxSeekBarChangeListener {
                      public void onMinMaxSeekProgressChanged(SeekBar seekBar, int i, boolean b);
                  
                      public void onStartTrackingTouch(SeekBar seekBar);
                  
                      public void onStopTrackingTouch(SeekBar seekBar);
                  }
                  
                  public void setOnIntegerSeekBarChangeListener(OnMinMaxSeekBarChangeListener floatListener) {
                      this.onMinMaxSeekBarChangeListener = floatListener;
                  }
                  }
                  

                  这个类的continue方法public void setMin(int minPrgress)用于设置Seek Bar的最小值 此类 contin 方法public void setMax(int maxPrgress) 用于设置 Seek Bar 的最大值

                  【讨论】:

                  • 我无法完成这项工作 - 您的搜索栏在错误的位置绘制了搜索指示器
                  【解决方案13】:

                  Seek Bar 有设置最大值但没有设置最小值的方法 在这里我写了一个设置最小搜索栏值的代码 当我们添加此代码时,您的搜索栏值不小于 mim 值 试试这个对我来说很好用

                  /* 该方法在搜索栏值改变后调用 */

                              public void onProgressChanged(SeekBar seekBar, int progress,
                                  boolean fromUser) {
                              /* Check the current seekbar value is greather than min value*/
                              if (progress < MIN_VALUE) {
                                  /* if seek bar value is lesser than min value then set min value to seek bar */
                                  seekBar.setProgress(MIN_VALUE);
                              }
                  
                          }
                  

                  【讨论】:

                  • 请解释一下这段代码的作用。只是不要单独留下代码。
                  【解决方案14】:
                  seekbar.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) {
                  
                                  int MIN = 5;
                                  if (progress < MIN) {
                  
                                      value.setText(" Time Interval (" + seektime + " sec)");
                                  } else {
                                      seektime = progress;
                                  }
                                  value.setText(" Time Interval (" + seektime + " sec)");
                  
                              }
                          });
                  

                  【讨论】:

                  • 谢谢。我使用了一个带有预填数字的 NumberPicker。
                  • 嘿,为什么 Android Studio 说方法不会覆盖其超类中的方法?
                  • 我想在 Seekbar 中设置 -180 到 180 的值。它在 android 以上 5 个版本的 android 设备中运行良好,但在下面它没有显示 Seekbar 中的负值。
                  【解决方案15】:

                  设置搜索栏最大值和最小值

                  seekbar have method that setmax(int position) and setProgress(int position)
                  

                  谢谢

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-11-03
                    • 2019-02-10
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多