Android自定义日历/日期选择器

时间:2016-01-08 08:16:49

标签: java android android-custom-view android-calendar android-datepicker

这是新的默认DatePickerDialog小部件从Android 5.0开始显示的内容:

enter image description here

我的项目经理不太喜欢这个。他们想要的是"旧式" Holo日期采集器,曾经是Marshmallow&棒糖。像这样:

enter image description here

我面前有两个选择:

  • 使用由其他人开发的现有日历小部件,其外观和感觉与上述相同。
  • 使用完整的日历功能创建我自己的日历小部件。

如果我要创建自己的小部件,那么创建UI非常简单。我的问题是,我如何为这样的日历编写业务逻辑,即如何用真实数据来支持它?我如何计算闰年和不同月份的天数? 最重要的是,我需要三个 NumberPicker s 在最小和最大范围内保持同步。它应该可以滚动超出最小和最大限制。这是我无法解决的问题。

这是我到目前为止所做的事情:

  • 我已经使用了 NumberPicker 里面的小部件 DialogFragment, 而且我已经习惯了 setMinValue()setMaxValue() 设置每个NumberPicker的范围。
  • 当一年发生变化时(例如从2011年到2012年),我计算出数字 使用

    在当月的天数
       cal = new GregorianCalendar(y, m, d);
       daysInMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
    

    here所述。

  • 当用户从12月滚动到1月或1月到12月时, 我以编程方式滚动年份选择器以增加或 如上所述分别减少 here
  • 使用setWrapSelectorWheel()阻止日,月和年的选择器滚动超出其最小值和最大值。

所以我的问题是,是否有一个预先存在的小部件,例如我可以使用的这个小部件?或者,有没有办法用真实的日历数据支持NumberPicker,并让它们在最小和最大日期范围内同步滚动?请指导我。所有答案将不胜感激。

修改

虽然给定的答案有效,但值得注意的是,还有一种更好的方法:将DatePicker包裹在DialogFragment中。

1 个答案:

答案 0 :(得分:1)

您可以使用API​​日期选择器并告诉它使用此构造函数使用Holo Design:DatePickerDialog (Context, int, DatePickerDialog.OnDateSetListener, int, int, int)

请参阅有关此问题的评论:DatePicker crash in samsung with android 5.0

您可能需要稍微调整主题。

以下是我们在行动中使用此功能的方法:https://github.com/dmfs/opentasks/blob/master/src/org/dmfs/tasks/widget/TimeFieldEditor.java#L437