Android DatePickerDialog - происходит сбой с IllegalArgumentException

Что-то странное происходит в моем эмуляторе Android (код и эмулятор работают на API Level 10 - Android 2.3.3): текущая дата в моем эму - 22.08.2011 - если я инициализирую DatePickerDialog с этими настройками (используя значения из нового Date() - инициализирует 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 (потому что по трассировке я знал, что он не работает в методе updateSpinners) и в этой строке 357 (четвертая строка в приведенном выше стеке). trace) он вызывает 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

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 - проблема была со значениями Date, которые я ему передал. Однако было бы неплохо, если бы в сообщении об ошибке были указаны точные значения, а не текущие:>= ...

Я думаю, что это не будет компилировать, сделать dateTime поле final, Кроме того, вы объявили dateSetListener?

Другие вопросы по тегам