【问题标题】:Android number picker using stepsAndroid号码选择器使用步骤
【发布时间】:2015-09-11 05:56:36
【问题描述】:

我设法创建了一个数字选择器,它以 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;索引=12

我不明白为什么号码已成功创建,为什么号码选择器在选择时会崩溃?

【问题讨论】:

  • 你从哪里得到异常?
  • 在 android.widget.NumberPicker.ensureCachedScrollSelectorValue(NumberPicker.java:1825)
  • 错误原因:i &lt;= maxValue
  • 将其更改为 i

标签: java android numberpicker


【解决方案1】:

改变这个:

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

【讨论】:

  • 它开始,然后在 60 时退出
  • 我是否仍应将大小实现为 String[] numberValues = new String[maxValue/minValue];?
  • 结果证明将最大值设置为 11 起到了作用 - mNumberPicker.setMaxValue(11);
【解决方案2】:

我会将问题的参数 mNumberPicker 替换为 np

setDisplayedValues() :显示值数组的长度必须等于可选数字的范围,即 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);

`

【讨论】:

    【解决方案3】:

    还有另一种方法可以解决这个问题,可以说,它可能看起来更直观。它使用 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));
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-25
      • 2018-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2011-03-22
      • 1970-01-01
      相关资源
      最近更新 更多