Изменение или изменение минимального, максимального и отображаемого значений для NumberPicker

У меня есть выбор номера для минут. Первоначально я установил отображаемые значения с 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);
}

person Nanda Ramesh    schedule 13.03.2014    source источник


Ответы (1)


Похоже, это происходит потому, что когда NumberPicker обнаруживает изменение либо в отображаемых значениях, либо в максимальном значении, он пытается обновить значения представления (т. е. получить доступ к массиву отображаемых значений). Поэтому, если вы установите отображаемые значения меньше, чем maxValue - minValue, будет выдано ArrayOutOfBoundsException, и аналогичным образом, если вы установите максимальное значение, превышающее текущее, оно выдаст исключение. Если вы установите для отображаемых значений значение null перед изменением значений min/max, представление по умолчанию вернется к простому отображению значения и вообще не будет обращаться к массиву.

Так что в вашем случае я бы сделал что-то вроде этого...

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);
}
person StackJP    schedule 14.08.2014