DatePickerDialog日期验证实现:按当日日期限制可选日期范围
没问题,我帮你搞定这个按当日日期动态限制DatePicker可选范围的功能,直接看下面的代码和说明就懂了:
实现方案与完整代码
核心思路就是先拿到今天的日期,然后根据日期是15号前还是后,给DatePicker设置对应的可选日期范围,用户直接选不了超出范围的日期,比监听拦截更友好。
步骤拆解与代码实现
private void DateDialog() { // 第一步:获取今天的日期,拿到当天是几号 Calendar currentCal = Calendar.getInstance(); int currentDay = currentCal.get(Calendar.DAY_OF_MONTH); // 第二步:初始化DatePickerDialog,默认选中当前日期 DatePickerDialog dpDialog = new DatePickerDialog( this, android.app.AlertDialog.THEME_DEVICE_DEFAULT_DARK, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker datePicker, int year, int month, int dayOfMonth) { // 这里写你选中日期后的逻辑,比如把选中的日期赋值给cal cal = Calendar.getInstance(); cal.set(year, month, dayOfMonth); // 比如更新显示选中日期的TextView之类的操作 } }, currentCal.get(Calendar.YEAR), currentCal.get(Calendar.MONTH), currentCal.get(Calendar.DAY_OF_MONTH) ); // 第三步:拿到Dialog里的DatePicker控件,设置可选范围 DatePicker datePicker = dpDialog.getDatePicker(); if (currentDay < 15) { // 今天在15号之前,限制只能选1-15日 // 设置最小日期:当月1号 Calendar minCal = Calendar.getInstance(); minCal.set(currentCal.get(Calendar.YEAR), currentCal.get(Calendar.MONTH), 1); datePicker.setMinDate(minCal.getTimeInMillis()); // 设置最大日期:当月15号 Calendar maxCal = Calendar.getInstance(); maxCal.set(currentCal.get(Calendar.YEAR), currentCal.get(Calendar.MONTH), 15); datePicker.setMaxDate(maxCal.getTimeInMillis()); } else { // 今天在15号及之后,限制只能选16到当月最后一天 // 设置最小日期:当月16号 Calendar minCal = Calendar.getInstance(); minCal.set(currentCal.get(Calendar.YEAR), currentCal.get(Calendar.MONTH), 16); datePicker.setMinDate(minCal.getTimeInMillis()); // 设置最大日期:当月实际的最后一天(自动适配2月、30天的月份) Calendar maxCal = Calendar.getInstance(); maxCal.set(currentCal.get(Calendar.YEAR), currentCal.get(Calendar.MONTH), maxCal.getActualMaximum(Calendar.DAY_OF_MONTH)); datePicker.setMaxDate(maxCal.getTimeInMillis()); } // 最后显示对话框 dpDialog.show(); }
额外说明
- 用
setMinDate()和setMaxDate()来限制范围,用户根本点不了超出的日期,体验比监听日期变化再拦截好很多。 - 处理当月最大天数的时候用了
getActualMaximum(Calendar.DAY_OF_MONTH),自动适配不同月份的天数,不用担心设置了不存在的日期(比如2月30号)。 - 如果你的项目是Android API 26及以上,也可以用
LocalDate来简化日期处理,代码会更简洁,但上面的代码兼容所有低版本。
内容的提问来源于stack exchange,提问作者RAJ KUMAR
相关产品推荐
相关产品推荐

