Lollipop CalenderView DatePicker 不调用 OnDateChanged() 方法

Posted

技术标签:

【中文标题】Lollipop CalenderView DatePicker 不调用 OnDateChanged() 方法【英文标题】:Lollipop CalenderView DatePicker doesn't call OnDateChanged() method 【发布时间】:2015-02-09 00:39:17 【问题描述】:

我正在使用 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 中检索更改的日期?

【问题讨论】:

这是一个框架错误,已在下一个版本中修复。不幸的是,我认为没有一种干净的方法可以解决它。 @alanv 我担心它会变成那样 8^( 不过,谢谢你的评论。现在我可以停止为此而苦恼了。 你现在能做的最好的可能就是将日期选择器模式设置为 XML 中的“微调器”。 @alanv 这就是我现在决定采取的路线。再次感谢。 将 AOSP 票证放在这里以供将来参考:code.google.com/p/android/issues/detail?id=147657 【参考方案1】:

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

原因是在 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;

【讨论】:

如果您使用小部件,请在 onResume 中执行 可能比在onDateChange() 中创建大量“日期”对象更有效。【参考方案2】:

在您的 Xml 布局中设置:

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

使用 "android:spinnersShown="false" " 你告诉它不要显示 Spinner。但它会调用 'onDateChanged' 方法。

【讨论】:

以上是关于Lollipop CalenderView DatePicker 不调用 OnDateChanged() 方法的主要内容,如果未能解决你的问题,请参考以下文章

Lollipop 上的 Android Button Ripple 和 pre lollipop 上的高亮显示

Lollipop:获取热门活动名称

我的 Material Design ActionBar 或 Lollipop 设备中的 StatusBar 上没有显示颜色,但在 Pre-Lollipop 设备的 ActionBar 中显示。为啥?

Lollipop:在 statusBar 后面绘制,其颜色设置为透明

Lollipop上方的推送通知图标为白色[重复]

Android 5.0 Lollipop 上的 UnsatisfiedLinkError