Android 号码选择器使用步骤
Android number picker using steps
我已经设法创建了一个数字选择器,它以 5 为增量在 5 到 60 之间循环。我唯一的问题是当我达到 60 时,应用程序崩溃了。
//Number pickers
int minValue = 5;
int maxValue = 60;
int step = 5;
String[] numberValues = new String[maxValue/minValue];
for (int i = minValue; i <= maxValue; i+= step)
{
numberValues[(i/step)-1] = String.valueOf(i);
}
mNumberPicker = (NumberPicker)findViewById(R.id.numberPicker);
mNumberPicker.setMinValue(0);
mNumberPicker.setMaxValue(60);
//mNumberPicker.setValue(20);
mNumberPicker.setWrapSelectorWheel(false);
mNumberPicker.setDisplayedValues(numberValues);
logcat
中也有错误信息
java.lang.ArrayIndexOutOfBoundsException: length=12; index=12
我不明白为什么号码已经创建成功了,为什么选择号码的时候会闪退?
改变这个:
for (int i = minValue; i <= maxValue; i+= step)
{
numberValues[(i/step)-1] = String.valueOf(i);
}
为此:
for (int i = 0; i < numberValues.length; i++)
{
numberValues[i] = String.valueOf(step + i*step);
}
或者,如果你想让它保持混乱(尚未测试但应该有效):
for (int i = minValue; i < maxValue; i+= step)
{
numberValues[(i/step)-1] = String.valueOf(i);
}
我会将问题的参数 mNumberPicker 替换为 np
setDisplayedValues() : The length of the displayed values array must be equal to the range of selectable numbers which is equal to np.getMaxValue() - np.getMinValue() + 1.
因此,您必须使 numberValues.length() == np.getMaxValue() - np.getMinValue() + 1 为真。
在您的情况下,使 np.setMaxValue(12) 而不是 (60) 并像下面那样做。它会起作用。
简而言之,如果您希望在 NumberPicker 中排列 10~200 个,并且预期步长为 10:
设置minValue = 1, maxValue = 20 and step = 10;
int minValue = 1;
int maxValue = 12;
int step = 5;
String[] numberValues = new String[maxValue - minValue + 1];
for (int i = 0; i <= maxValue - minValue; i++) {
numberValues[i] = String.valueOf((minValue + i) * step);
}
np = (NumberPicker)findViewById(R.id.numberPicker);
np.setMinValue(minValue);
np.setMaxValue(maxValue);
np.setWrapSelectorWheel(false);
np.setDisplayedValues(numberValues);
`
还有另一种方法可以解决这个问题,可以说,它似乎更直观。它使用 onValueChange 方法:
@Override
public void onValueChange(NumberPicker np, int oldVal, int newVal) {
if (newVal > oldVal) {
if (newVal < np.getMaxValue())
np.setValue(newVal+(myStep-1));
}
else
np.setValue(newVal-(myStep-1));
}
我已经设法创建了一个数字选择器,它以 5 为增量在 5 到 60 之间循环。我唯一的问题是当我达到 60 时,应用程序崩溃了。
//Number pickers
int minValue = 5;
int maxValue = 60;
int step = 5;
String[] numberValues = new String[maxValue/minValue];
for (int i = minValue; i <= maxValue; i+= step)
{
numberValues[(i/step)-1] = String.valueOf(i);
}
mNumberPicker = (NumberPicker)findViewById(R.id.numberPicker);
mNumberPicker.setMinValue(0);
mNumberPicker.setMaxValue(60);
//mNumberPicker.setValue(20);
mNumberPicker.setWrapSelectorWheel(false);
mNumberPicker.setDisplayedValues(numberValues);
logcat
中也有错误信息java.lang.ArrayIndexOutOfBoundsException: length=12; index=12
我不明白为什么号码已经创建成功了,为什么选择号码的时候会闪退?
改变这个:
for (int i = minValue; i <= maxValue; i+= step)
{
numberValues[(i/step)-1] = String.valueOf(i);
}
为此:
for (int i = 0; i < numberValues.length; i++)
{
numberValues[i] = String.valueOf(step + i*step);
}
或者,如果你想让它保持混乱(尚未测试但应该有效):
for (int i = minValue; i < maxValue; i+= step)
{
numberValues[(i/step)-1] = String.valueOf(i);
}
我会将问题的参数 mNumberPicker 替换为 np
setDisplayedValues() : The length of the displayed values array must be equal to the range of selectable numbers which is equal to np.getMaxValue() - np.getMinValue() + 1.
因此,您必须使 numberValues.length() == np.getMaxValue() - np.getMinValue() + 1 为真。 在您的情况下,使 np.setMaxValue(12) 而不是 (60) 并像下面那样做。它会起作用。
简而言之,如果您希望在 NumberPicker 中排列 10~200 个,并且预期步长为 10:
设置minValue = 1, maxValue = 20 and step = 10;
int minValue = 1;
int maxValue = 12;
int step = 5;
String[] numberValues = new String[maxValue - minValue + 1];
for (int i = 0; i <= maxValue - minValue; i++) {
numberValues[i] = String.valueOf((minValue + i) * step);
}
np = (NumberPicker)findViewById(R.id.numberPicker);
np.setMinValue(minValue);
np.setMaxValue(maxValue);
np.setWrapSelectorWheel(false);
np.setDisplayedValues(numberValues);
`
还有另一种方法可以解决这个问题,可以说,它似乎更直观。它使用 onValueChange 方法:
@Override
public void onValueChange(NumberPicker np, int oldVal, int newVal) {
if (newVal > oldVal) {
if (newVal < np.getMaxValue())
np.setValue(newVal+(myStep-1));
}
else
np.setValue(newVal-(myStep-1));
}