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
?