更改NumberPicker的步长(Change the step size of a Number

2019-07-01 09:18发布

是否有可能做到这一点比在OnScrollListener事件处理它更方便的方法? 可惜它没有一个步长属性...

Answer 1:

为什么不只是添加OnValueChangeListener喜欢的东西:

numberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {

     @Override
     public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
         picker.setValue((newVal < oldVal)?oldVal-5:oldVal+5);
     }

});


Answer 2:

在Android上的NumberPicker有一个名为方法setDisplayedValues 。 你可以用这个来显示自定义的值(它需要一个字符串数组),然后将它们映射,当你需要的价值。 所以,如果你需要在分钟拾取的5个步骤,例如,你可以创建一个这样的数组:

String[] minuteValues = new String[12];

for (int i = 0; i < minuteValues.length; i++) {
    String number = Integer.toString(i*5);
    minuteValues[i] = number.length() < 2 ? "0" + number : number;
}

minutePicker.setDisplayedValues(minuteValues);

然后当你的价值OnValueChangeListener ,你只需要转换回一个整数:

Integer.parseInt(minuteValues[newVal]);


Answer 3:

要设置的“5”,例如,使用步进计数NumberPicker.Formatter :

    NumberPicker.Formatter formatter = new NumberPicker.Formatter() {
        @Override
        public String format(int value) {
            int temp = value * 5;
            return "" + temp;
        }
    };
    numberPicker.setFormatter(formatter);


Answer 4:

在Android上的NumberPicker有一个名为方法setDisplayedValues 。 你可以用这个来显示自定义的值(它需要一个字符串数组),然后将它们映射,当你需要的价值。

例如,您可以创建这样的功能:

public String[] getArrayWithSteps (int iMinValue, int iMaxValue, int iStep)
{ 
   int iStepsArray = (iMaxValue-iMinValue) / iStep+1; //get the lenght array that will return

   String[] arrayValues= new String[iStepsArray]; //Create array with length of iStepsArray 

   for(int i = 0; i < iStepsArray; i++)
   {
     arrayValues[i] = String.valueOf(iMinValue + (i * iStep));
   }

   return arrayValues;
}

所以,你应该调用方法> NumberPicker.setDisplayedValues ,例如:

int min = 5;
int max = 180;
int step = 10;

String[] myValues = getArrayWithSteps(min, max, step); //get the values with steps... Normally 

//Setting the NumberPick (myNumberPick)
myNumberPick.setMinValue(0);
myNumberPick.setMaxValue((max-step) / min + 1); //Like iStepsArray in the function
//Because the Min and Max Value should be the range that will show. 
//For example, Min = 0 and Max = 2, so the NumberPick will display the first three strings in the array String (myValues); 
myNumberPick.setDisplayedValues(myValues);//put on NumberPicker 

为了获得在NumberPick的价值:

String sValue = String.valueOf(10+(myNumberPick.getValue()*5)); //->> (iMinValue + (myNumberPick.getValue()*iStep))


Answer 5:

这是ajpolt解决方案更好的方法

与任何预定义的步长,它通过键盘设置自定义值支持。

 final NumberPicker np = (NumberPicker) dialogView.findViewById(R.id.numberPicker1);
    np.setMaxValue(1000); // max value 1000
    np.setMinValue(0);   // min value 0
    np.setValue(defValue);
    np.setWrapSelectorWheel(false);
    final int m_oldFocus = np.getDescendantFocusability();
    np.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
    np.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            np.setDescendantFocusability(m_oldFocus);
            return false;
        }
    });

    np.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
        @Override
        public void onValueChange(NumberPicker numberPicker, int oldVal, int newVal) {
            int stepSize = 10;
            if(newVal%stepSize !=0){
                if(newVal < oldVal){
                    numberPicker.setValue(((int)(newVal/stepSize)) *stepSize);
                }else{
                    numberPicker.setValue((((int)(newVal/stepSize)) *stepSize ) +stepSize );
                }

            }else{
                numberPicker.setValue(newVal);
            }

        }
    });

*我知道这是5岁的问题,但可能是有用的人



Answer 6:

当使用如上所述的方法,需要注意,选择器允许用户不仅通过滚动来选择一个值,而且还通过用键盘输入密码。

默认情况下,输入字段的输入类型被设置为TYPE_CLASS_NUMBER ,因此用户呈现数字键盘。 看来,当你使用setDisplayedValues的选择器类型更改为TYPE_CLASS_TEXT ,然而,当你使用setFormatter输入类型没有变化。

因此,在这种情况下,使用格式可能会导致意外的行为。 比方说,你希望用户能够只挑值“0”或“5”。 你可能有这样的代码:

NumberPicker numberPicker = (NumberPicker) findViewById(R.id.my_number_picker);
numberPicker.setMinValue(0);
numberPicker.setMaxValue(1);
numberPicker.setFormatter(v -> v == 0 ? "0" : "5");

然而,在这种情况下的用户提供数字键盘,但只能够只输入“0”或“1”。

如果改用:

numberPicker.setDisplayedValues(new String[] { "0", "5" });

用户将看到文字的键盘,但可以输入“0”或“5”的预期。

如果您正在使用文本键盘打扰你可以使用反射来访问私有字段并设定输入型回数(这是不推荐,除非真有必要,当然)。 如果你的目标老歌goldies像姜饼场被称为“mInputText”或“多行文字”。

    try {
        Field inputField = NumberPicker.class.getDeclaredField("mInputText");
        inputField.setAccessible(true);

        EditText inputText = (EditText) inputField.get(numberPicker);
        inputText.setRawInputType(InputType.TYPE_CLASS_NUMBER);
    } catch (ClassCastException e) {
        // Just ignore this exception and do nothing.
    } catch (IllegalAccessException e) {
        // Just ignore this exception and do nothing.
    } catch (NoSuchFieldException e) {
        // Just ignore this exception and do nothing.
    }


文章来源: Change the step size of a NumberPicker