Lollipop CalenderView DatePicker не вызывает метод OnDateChanged()

Я работаю с DatePicker и обнаружил, что в Android 5.0 он не будет вызывать метод OnDateChanged() в своем OnDateChangedListener, когда он находится в режиме CalendarView, даже если была выбрана новая дата. Если android:datePickerMode="spinner" установлен в xml-теге DatePicker, DatePicker будет отображаться как счетчик и будет вызывать OnDateChanged() при выборе новой даты. В более ранних версиях Android DatePicker вызывает OnDateChanged() при выборе новой даты в версиях CalendarView и Spinners. Вот соответствующий код:

@SuppressLint("InflateParams")
View v = getActivity().getLayoutInflater().inflate(R.layout.dialog_date, null);

 DatePicker datePicker = (DatePicker) v.findViewById(R.id.dialog_date_DatePicker);
 datePicker.init(year, month, day, new DatePicker.OnDateChangedListener() {
       @Override
       public void onDateChanged(DatePicker view, int year, int month, int day) {
           //Translate year, month, day into a Date object using a calendar
           mDate = new GregorianCalendar(year, month, day).getTime();
           //Update argument to preserve selected value on rotation
           getArguments().putSerializable(EXTRA_DATE, mDate);
       }
  });

В моем приложении onDateChanged() не вызывается, и mDate не изменяется, если DatePicker находится в режиме CalendarView под Lollipop, но вызывается OnDateChanged(), и mDate действительно изменяется, если DatePicker находится в режиме Spinners. В более ранних версиях Android вызывается OnDateChanged(), и mDate изменяется в обеих версиях DatePicker.

Есть ли способ заставить CalendarView DatePicker в 5.0 вызывать OnDateChanged()? В противном случае, как еще я могу получить измененную дату из DatePicker, когда он находится в режиме CalendarView?


person knutsondc    schedule 10.12.2014    source источник
comment
Это ошибка фреймворка, которая будет исправлена ​​в следующем выпуске. Я не думаю, что есть чистый способ обойти это, к сожалению.   -  person alanv    schedule 10.12.2014
comment
@alanv Я боялся, что это будет что-то вроде этого 8^( Спасибо за ваш комментарий, однако. Теперь я могу перестать биться головой о стену об этом.   -  person knutsondc    schedule 10.12.2014
comment
Лучшее, что вы можете сделать на данный момент, это просто установить режим выбора даты на счетчик из XML.   -  person alanv    schedule 10.12.2014
comment
@alanv На данный момент я решил пойти по этому пути. Еще раз спасибо.   -  person knutsondc    schedule 10.12.2014
comment
Поместите билет AOSP здесь для дальнейшего использования: code.google.com/p /android/issues/detail?id=147657   -  person eski    schedule 01.09.2015


Ответы (2)


Я сталкиваюсь с той же проблемой, и дело в том, что слушатели onDateChange() и onTimeSet() для DatePicker и TimePicker не вызываются в устройствах Nexus с Lollipop Update.

Причина в нексусных устройствах, так как приложение часов обновляется, слушатели не работают.

Обходной путь заключается в том, что после закрытия диалогового окна вам необходимо создать собственный прослушиватель и установить значения в объекте календаря с помощью методов datepicker get() и передать календарь слушателю.

Простой пример кода

/**
 * Returns the calendar instance once the date and time is set.
 * @return
 */
public Calendar getDateTime() {
    mCalendar.set(datePicker.getYear(),
                  datePicker.getMonth(),
                  datePicker.getDayOfMonth(),
                  timePicker.getCurrentHour(),
                  timePicker.getCurrentMinute());
    return mCalendar;
}
person Vishnu Prabhu    schedule 03.02.2015
comment
Если вы используете виджет, сделайте это в onResume - person L. G.; 12.08.2015
comment
Вероятно, это более эффективно, чем создание множества объектов Date в onDateChange(). - person samis; 26.02.2019

Установите это в своем Xml-Layout:

<DatePicker
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:datePickerMode="spinner"
        android:spinnersShown="false"
        android:id="@+id/datepicker_popupwindow"/>

С помощью "android:spinnersShown="false"" вы говорите ему не показывать Spinner. Но он вызовет метод onDateChanged.

person Lukay    schedule 08.04.2016