2014-03-13 58 views
7

我有一个分钟数字选择器。最初我将显示的值设置为15分钟的时间间隔。 即0,15,30,45,这意味着最小值为1,最大值为4. 在用户选择一个菜单选项时,我想动态地将相同的数字选取器更改为 有5分钟的间隔,这意味着显示的值将为0 ,5,10 ... 50,55 Min将保持为1,最大值将为12.修改或更改NumberPicker的最小值,最大值和显示值

它对两种类型的初始设置均正常工作。但是,当我尝试修改最大值或显示值时,我正在将数组从索引中移除。当改变特征两种方式时,即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); 
} 

回答

17

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

所以你的情况我会做一些事情是这样的...

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); 
} 
相关问题