设置NumberPicker默认值触发java.lang.ArrayIndexOutOfBoundsException异常原因
问题原因分析
核心错误:混淆了NumberPicker的「数值」与「显示文本」
NumberPicker的setValue()方法接收的是数值范围(minValue到maxValue)内的整数,而非你看到的显示文本对应的数字。
你的代码中:
- 数值范围是
0到4(setMinValue(0)、setMaxValue(4)) pickerValues数组的索引与显示文本的对应关系是:0→"20"、1→"30"、2→"40"、3→"50"、4→"60"
当你调用setValue(20)时,20远远超出了0-4的数值范围,NumberPicker内部尝试将这个值映射到数组索引时出现错误,最终导致ArrayIndexOutOfBoundsException(索引-1)。
你说设置默认值30时无异常,大概率是你误传了索引值1而非数字30——因为传1会对应显示"30",且1在0-4的范围内,自然不会报错。
次要问题:代码调用顺序错误
NumberPicker要求先设置数值范围(minValue、maxValue),再设置displayedValues。你的代码先设置了显示文本数组,再调整数值范围,可能导致控件内部状态不一致,进一步触发异常。
修正后的代码
NumberPicker numberPicker=inflated.findViewById(R.id.number_picker); final String[] pickerValues = new String[] {"20", "30", "40", "50","60"}; // 先设置数值范围 numberPicker.setMinValue(0); numberPicker.setMaxValue(pickerValues.length-1); // 再绑定显示文本数组 numberPicker.setDisplayedValues(pickerValues); // 设置默认显示"20",传入对应索引0 numberPicker.setValue(0); // 如果要默认显示"30",传入索引1即可 // numberPicker.setValue(1);
内容的提问来源于stack exchange,提问作者Josort
相关产品推荐
相关产品推荐

