11

我有几分钟的号码选择器。最初我将显示值设置为 15 分钟间隔。即,0,15,30,45 表示最小值为 1,最大值为 4。在用户选择菜单选项时,我想动态更改相同的数字选择器以具有 5 分钟的间隔,这意味着显示的值为 0,5, 10... 50,55 最小值将保持为 1,最大值为 12。

它适用于两种类型的初始设置。但是,当我尝试修改最大值或显示值时,我的数组超出了索引。当以两种方式更改特性时会出现问题,即 15 到 5 或 5 到 15 分钟的间隔。

问题是我做错了什么,还是数字选择器根本不可能。我的示例代码如下。谢谢。

private void setMinsPicker(String opt) {
    String[] mins15 = { "0", "15", "30", "45" };
    String[] mins5 = { "0", "5", "10", "15", "20", "25", "30", "35", "40",
            "45", "50", "55" };
    final String[] mins;

    if (opt == "15") {
        mins = mins15;
    } else {
        mins = mins5;
    }

    numPickerMinutes = (NumberPicker) findViewById(R.id.pMinutes);

    int ml = mins.length;

    numPickerMinutes.setMinValue(1);
    numPickerMinutes.setDisplayedValues(mins);
    numPickerMinutes.setMaxValue(ml);
}
4

1 回答 1

29

这似乎是因为当 NumberPicker 检测到显示值或最大值发生变化时,它会尝试刷新视图值(即访问显示值数组)。因此,如果您设置的显示值小于maxValue - minValue它会抛出的ArrayOutOfBoundsException值,类似地,如果您设置的最大值大于当前值,它会很好地抛出异常。如果在更改最小/最大值之前将显示值设置为 null,则视图将默认返回仅显示值并且根本不会访问数组。

所以在你的情况下,我会做这样的事情......

private void setMinsPicker(String opt) {
    String[] mins15 = { "0", "15", "30", "45" };
    String[] mins5 = { "0", "5", "10", "15", "20", "25", "30", "35", "40",
            "45", "50", "55" };
    final String[] mins;

    if (opt == "15") {
        mins = mins15;
    } else {
        mins = mins5;
    }

    numPickerMinutes = (NumberPicker) findViewById(R.id.pMinutes);

    int ml = mins.length;

    // Prevent ArrayOutOfBoundExceptions by setting
    // values array to null so its not checked
    numPickerMinutes.setDisplayedValues(null);

    numPickerMinutes.setMinValue(1);
    numPickerMinutes.setMaxValue(ml);
    numPickerMinutes.setDisplayedValues(mins);
}
于 2014-08-14T18:15:44.490 回答