是否可以以比在OnScrollListener事件中处理它更方便的方式执行此操作?可惜它没有步长属性......
答案 0 :(得分:26)
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]);
答案 1 :(得分:11)
设置&#39; 5&#39;的步数例如,使用NumberPicker.Formatter:
NumberPicker.Formatter formatter = new NumberPicker.Formatter() {
@Override
public String format(int value) {
int temp = value * 5;
return "" + temp;
}
};
numberPicker.setFormatter(formatter);
答案 2 :(得分:7)
为什么不添加OnValueChangeListener之类的东西:
numberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
picker.setValue((newVal < oldVal)?oldVal-5:oldVal+5);
}
});
答案 3 :(得分:5)
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;
}
所以,你应该调用方法&gt; 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))
答案 4 :(得分:1)
这是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岁的问题,但可能对某人有用
答案 5 :(得分:0)
使用上述方法时,需要注意选择器不仅允许用户通过滚动选择值,还可以通过键盘输入。
默认情况下,输入字段的输入类型设置为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”。
如果您对文本键盘感到困扰,可以使用反射来访问私有字段并将输入类型设置回数字(除非确实需要,否则当然不建议这样做)。该字段被称为“mInputText”或“mText”,如果你的目标是像Gingerbread这样的老玩家。
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.
}