16

我正在使用 DatePicker 并发现在 Android 5.0 下,即使选择了新日期,当它处于 CalendarView 模式时,它也不会在其 OnDateChangedListener 中调用 OnDateChanged() 方法。如果在 DatePicker 的 xml 标签中设置了 android:datePickerMode="spinner",则 DatePicker 将显示为微调器,并在选择新日期调用 OnDateChanged()。在早期版本的 Android 中,当在 CalendarView 和 Spinners 版本中选择新日期时,DatePicker 会调用 OnDateChanged()。以下是相关代码:

@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);
       }
  });

在我的应用程序中,如果 DatePicker 在 Lollipop 下处于 CalendarView 模式,则不会调用 onDateChanged() 并且不会更改 mDate,但是如果 DatePicker 处于 Spinners 模式,则会调用 OnDateChanged() 并且会更改 mDate。在早期版本的 Android 中,在两个版本的 DatePicker 中都会调用 OnDateChanged() 并更改 mDate。

有没有办法让 5.0 中的 CalendarView DatePicker 调用 OnDateChanged()?如果做不到这一点,当 DatePicker 处于 CalendarView 模式时,我还能如何从 DatePicker 中检索更改的日期?

4

2 回答 2

7

我面临同样的问题,问题是 DatePicker 和 TimePicker 的 onDateChange() 和 onTimeSet() 侦听器在带有棒棒糖更新的 Nexus 设备中没有被调用。

原因是在 nexus 设备中,由于时钟应用程序已更新,侦听器无法正常工作。

解决方法是一旦对话框关闭,您需要创建自己的侦听器并使用 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;
}
于 2015-02-03T12:29:38.463 回答
0

在您的 Xml 布局中进行设置:

<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”方法。

于 2016-04-08T06:53:07.863 回答