这是我参与 8 月更文挑战的第 3 天,活动详情查看: 8月更文挑战
背景
项目需要做一个年月日选择框, 之前一直用PickerView这个三方库做日期选择,所以当时第一时间就想到了他, 由于需求需要根据不同的地区显示对应的日期格式PickerView显然不满足条件,于是从google查到了DatePicker
效果
集成
1.在xml中插入DatePicker
<DatePicker
android:id="@+id/data_picker"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FFFFFFFF"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
2.在代码中初始化并调用
在init方法中传入需要初始化显示的年月日
Calendar calendar = Calendar.getInstance();
DatePicker datePicker = findViewById(R.id.data_picker);
datePicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_YEAR), new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
}
});
效果如下
由于需求年月日是滚轮形式, 当前样式并不满足需求.
样式调整
在查看文档 时发现DatePicker有android:datePickerMode简介如下
Defines the look of the widget. Prior to the L release, the only choice was spinner. As of L, with the Material theme selected, the default layout is calendar, but this attribute can be used to force spinner to be used instead.
Must be one of the following constant values.
大概意思就是说从Android L开始DatePicker默认样式为日历样式,如果想调整样式android:datePickerMode就必须设置为以下两个值的其中之一
| 字段 | 值 | 简介 |
|---|---|---|
| calendar | 2 | Date picker with calendar to select the date. |
| spinner | 1 | Date picker with spinner controls to select the date. |
添加对应的值之后效果如下
滚轮确实出来了,但是日历并没有消失, 进过查到发现有
android:calendarViewShown这个属性,对应的是布尔值.介绍如下:
Whether the calendar view is shown. Only valid for "spinner" mode.
May be a boolean value, such as "true" or "false".
最终xml代码如下
<DatePicker
android:id="@+id/data_picker"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FFFFFFFF"
android:calendarViewShown="false"
android:datePickerMode="spinner"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
效果图如下
至此Ui满足需求
设置最大值最小值
在需求中选择日期有时会有最大值最小值的要求
在文档中发现有setMaxDate和setMinDate这两个方法分别可以设置最大值和最小值
PS: 这两个方法需要的时间参数为毫秒级别
根据不同地区格式化对应的日期格式
目前我在项目中用到的方法是java.text.包下的DateFormat类中的方法
java.text.DateFormat.getDateInstance(java.text.DateFormat.MEDIUM).format(Date(date))
PS: DatePicker的回调方法中年月日是分开返的,而不是返回的时间戳,需要自己转换
DatePicker常用属性
android:spinnersShown:是否显示滚轮
android:calendarViewShown:是否显示日历
android:datePickerMode:控件显示方式calendar或spinner
android:calendarTextColor:日历文字颜色
android:startYear:日历开始年份
android:endYear:日历结束年份
android:minDate:日历最小值
android:maxDate:日历最大值