更改NumberPicker的步长

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

Solutions Collecting From Web of "更改NumberPicker的步长"

为什么不只是添加一个OnValueChangeListener就像这样:

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

Android中的NumberPicker有一个名为setDisplayedValues的方法。 您可以使用这个来显示自定义值(它需要一个string数组),然后在需要该值时映射它们。 所以,如果你需要一个分钟select器的步骤5,你可以像这样创build一个数组:

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

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

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

Android中的NumberPicker有一个名为setDisplayedValues的方法。 您可以使用这个来显示自定义值(它需要一个string数组),然后在需要该值时映射它们。

例如,你可以创build一个像这样的函数:

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

对不起我的英文…

当使用上述方法时,需要注意的是,选取器不仅允许用户通过滚动来select值,而且还可以通过键盘input值。

默认情况下,input字段的inputtypes设置为TYPE_CLASS_NUMBER ,因此用户可以使用数字键盘。 看起来,当你使用setDisplayedValues ,select器将types更改为TYPE_CLASS_TEXT ,但是,当使用setFormatter ,inputtypes不会更改。

因此在这种情况下使用格式化程序可能会导致意外的行为。 假设您希望用户只能select值“0”或“5”。 你可能有这样的代码:

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

但是,在这种情况下,用户会看到数字键盘,但只能input“0”或“1”。

如果你使用:

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

用户将看到文本键盘,但将能够按预期input“0”或“5”。

如果您对文本键盘感到困扰,则可以使用reflection来访问专用字段,并将inputtypes重新设置为数字(当然,除非确实需要,否则不build议这样做)。 如果你的目标是姜饼,那么这个字段叫做“mInputText”或者“mText”。

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