我有一个数字选择器几分钟。最初我将显示的值设置为15分钟。 即0,15,30,45,表示Min为1,max为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);
}
答案 0 :(得分:22)
似乎发生这种情况是因为当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);
}