Android 自定义日历/日期选择器
Android custom calendar / date picker
这是新的默认 DatePickerDialog
小部件从 Android 5.0 开始出现的样子:
我的项目经理不太喜欢这个。他们想要的是 Marshmallow & Lollipop 之前的 "old style" Holo 日期选择器。像这样:
我有两个选择:
- 使用其他人开发的具有与上述相同外观的现有日历小部件。
- 创建我自己的具有完整日历功能的日历小部件。
如果我要创建自己的小部件,那么创建 UI 就足够简单了。我的问题是,如何为这样的日历编写业务逻辑,即如何用真实数据支持它?如何计算闰年和不同月份的天数? 最重要的是,我需要三个 NumberPicker
在最小和最大范围方面保持同步。它应该NOT 无法滚动到最小和最大限制之外。这是我一直没能解决的问题。
这是我到目前为止所做的:
- 我用过
NumberPicker
里面的小部件
DialogFragment
,
我用过
setMinValue()
和
setMaxValue()
设置每个 NumberPicker
. 的范围
当年份发生变化时(比如从2011年到2012年),我计算出这个数字
使用
当月的天数
cal = new GregorianCalendar(y, m, d);
daysInMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
如所述here.
- 当用户从十二月滚动到一月或一月滚动到十二月时,
我以编程方式滚动年份选择器以增加或
按照说明分别递减
here.
- 使用
setWrapSelectorWheel()
. 可以防止日、月和年的选择器滚动到它们的最小值和最大值之外
所以我的问题是,是否有我可以使用的像这个这样的预先存在的小部件?或者,有没有办法用真实的日历数据支持 NumberPicker
s,并让它们在最小和最大日期范围内同步滚动?请指导我。所有答案将不胜感激。
编辑:
虽然给定的答案有效,但值得注意的是还有更好的方法:将 DatePicker
包装在 DialogFragment
.
中
您可以使用 API 日期选择器并使用此构造函数告诉它使用全息设计: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
这是新的默认 DatePickerDialog
小部件从 Android 5.0 开始出现的样子:
我的项目经理不太喜欢这个。他们想要的是 Marshmallow & Lollipop 之前的 "old style" Holo 日期选择器。像这样:
我有两个选择:
- 使用其他人开发的具有与上述相同外观的现有日历小部件。
- 创建我自己的具有完整日历功能的日历小部件。
如果我要创建自己的小部件,那么创建 UI 就足够简单了。我的问题是,如何为这样的日历编写业务逻辑,即如何用真实数据支持它?如何计算闰年和不同月份的天数? 最重要的是,我需要三个 NumberPicker
在最小和最大范围方面保持同步。它应该NOT 无法滚动到最小和最大限制之外。这是我一直没能解决的问题。
这是我到目前为止所做的:
- 我用过
NumberPicker
里面的小部件DialogFragment
, 我用过setMinValue()
和setMaxValue()
设置每个NumberPicker
. 的范围
当年份发生变化时(比如从2011年到2012年),我计算出这个数字 使用
当月的天数cal = new GregorianCalendar(y, m, d); daysInMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
如所述here.
- 当用户从十二月滚动到一月或一月滚动到十二月时, 我以编程方式滚动年份选择器以增加或 按照说明分别递减 here.
- 使用
setWrapSelectorWheel()
. 可以防止日、月和年的选择器滚动到它们的最小值和最大值之外
所以我的问题是,是否有我可以使用的像这个这样的预先存在的小部件?或者,有没有办法用真实的日历数据支持 NumberPicker
s,并让它们在最小和最大日期范围内同步滚动?请指导我。所有答案将不胜感激。
编辑:
虽然给定的答案有效,但值得注意的是还有更好的方法:将 DatePicker
包装在 DialogFragment
.
您可以使用 API 日期选择器并使用此构造函数告诉它使用全息设计: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