Android DatePickerDialog — сбой с IllegalArgumentException

Что-то странное происходит на моем эмуляторе Android (код и эмулятор работают на уровне API 10 — это Android 2.3.3): текущая дата на моем эму — 22.08.2011 — если я инициализирую DatePickerDialog с этими настройками (используя значения из нового Date() - который инициализирует дату текущей датой/временем), затем происходит сбой, за следующим исключением:

08-22 02:14:23.731: ERROR/AndroidRuntime(3038): FATAL EXCEPTION: main
08-22 02:14:23.731: ERROR/AndroidRuntime(3038): java.lang.IllegalArgumentException: current should be >= start and <= end
08-22 02:14:23.731: ERROR/AndroidRuntime(3038):     at android.widget.NumberPicker.setCurrent(NumberPicker.java:288)
08-22 02:14:23.731: ERROR/AndroidRuntime(3038):     at android.widget.DatePicker.updateSpinners(DatePicker.java:357)
08-22 02:14:23.731: ERROR/AndroidRuntime(3038):     at android.widget.DatePicker.init(DatePicker.java:352)
08-22 02:14:23.731: ERROR/AndroidRuntime(3038):     at android.app.DatePickerDialog.<init>(DatePickerDialog.java:127)
08-22 02:14:23.731: ERROR/AndroidRuntime(3038):     at android.app.DatePickerDialog.<init>(DatePickerDialog.java:86)

Поэтому я проверил исходный код для DatePicker (для API lvl 2.3.3), и я проверил код DatePicker (потому что из трассировки strack я знал, что он не работает в методе updateSpinners ) и в этой строке 357 (четвертая строка в приведенной выше трассировке стека) он вызывает mYearPicker.setCurrent(mYear); что заставило меня подумать, что что-то не так с моим годом. Я зарегистрировал год, который я прохожу - это 2011, как и ожидалось. Поэтому я вручную передал 2010 год, который сработал - появился DatePickerDialog - инициализированный 2010 годом (жаль, что мне действительно нужен текущий год - 2011;) ...).

Я немного в недоумении, в чем причина этого... Дата на моем эмуляторе - как упоминалось выше - правильно установлена ​​на 22.08.2011 - мой ПК-разработчик установлен на ту же дату...

Любые подсказки/идеи относительно того, где я ошибаюсь? Чтобы упростить задачу, вот фрагмент кода, в котором я инициализирую DatePickerDialog:

// Initializes a Date object with the current date and time for clarification:
// it is actually declared as a private member variable of my class - 
// just included it here so you guys know of which type dateTime ist

 Date dateTime = new Date();
 Button dateButton = new Button(context);
 dateButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
// dateSetListener is declared as well - but its code has no influence on the failure of 
// the DatePickerDialog - to ensure this I commented all code in the dateSetListener's 
// onDateSet method 

                Dialog dateDialog = new DatePickerDialog(v.getContext(), dateSetListener, dateTime.getYear(),
                        dateTime.getMonth(), dateTime.getDay());
                dateDialog.show();
            }
        });

Заранее спасибо и с наилучшими пожеланиями, Ready4Android


person Ready4Android    schedule 22.08.2011    source источник


Ответы (2)


Хорошо, немного повозившись, я прибегнул к тому, что должен был сделать ПУТЬ раньше: я записал значение

//As in my example dateTime was initialized with new Date()
dateTime.getYear()

И значение, показанное в журнале, было 111! Я знаю, что этот метод устарел и, очевидно, по уважительным причинам... Моя ошибка заключалась в том, чтобы не проверить, что возвращается значение 2011 - вместо этого возвращается 111 - как говорится в документации getYear(), он возвращает годы с 1900 - если мы прибавив 111 к 1900, мы получим 2011... На секунду у меня возникло искушение просто добавить 1900 к возвращаемому значению, но здравомыслие взяло верх надо мной, и я решил вместо этого использовать java-класс Calendar .

Причина, по которой я сначала был введен в заблуждение, заключается в том, что форматирование моей даты с использованием SimpleDateFormat привело к правильному году - я не учел внутреннюю работу SimpleDateFormat, иначе я мог бы понять, что я на неправильном пути с моим объектом Date .

Подводя итог: нет проблем с DatePickerDialog - проблема была со значениями даты, которые я ему передал. Однако было бы неплохо, если бы в сообщении об ошибке указывалось, что точные значения вместо текущих должны быть >= ...

person Ready4Android    schedule 27.08.2011
comment
Хороший совет. Обычно я использую класс Calendar для получения и установки даты и класс Date для вычислений и так далее. - person Anna Lam; 01.05.2012

Думаю не скомпилится, сделай dateTime поле final. Кроме того, вы объявили dateSetListener?

person Sandy    schedule 22.08.2011
comment
Здравствуйте, он компилируется и запускается ;) dateTime не объявляется окончательным, а является частной переменной-членом - в приведенном выше коде я просто включил его перед OnClickListener, чтобы люди знали, что это за переменная. И да, я также объявил dateSetListener - но это не имеет отношения к проблеме, так как не делает ничего, что мешает работе диалога (чтобы проверить это, я прокомментировал в нем код - и он, как и раньше, терпит неудачу). - person Ready4Android; 22.08.2011
comment
P.S. Если бы я на самом деле объявил dateTime тем же методом, что и при создании кнопки и OnClickListener, тогда вы были бы правы - он не скомпилировался бы и должен был быть окончательным. Но, как было сказано ранее, это частная переменная-член. Извините за путаницу, я добавил комментарий, чтобы прояснить это. - person Ready4Android; 22.08.2011
comment
Хорошо, я использовал тот же код, что и выше, в моем примере проекта, это дает мне некоторую ошибку. Также Dialog dateDialog у меня не работает. Но когда я меняю Dialog на DatePickerDialog, у меня все работает нормально. - person Sandy; 22.08.2011
comment
Привет, Сэнди, м-м-м, я пытался перейти с Dialog на DatePickerDialog - безрезультатно :( такое же исключение было раньше. - person Ready4Android; 26.08.2011