2014-03-13 92 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); 
} 
相關問題