You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中如何让MaterialDatePicker默认显示当月当前日期?

解决MaterialDatePicker初始显示当月第一天而非当天的问题

我明白你遇到的困扰:明明设置了默认选中当天,但MaterialDatePicker打开时却总是显示当月第一天,比如今天是5月30日,日历初始却定位到5月1日。这其实是因为你没配置日历打开时的初始滚动位置,下面给你具体的解决办法:

问题根源

你当前的代码只设置了可选日期的起始边界(con.setStart(today))和默认选中日期(startDateBuilder.setSelection(today)),但没有指定日历打开时要滚动到的位置。MaterialDatePicker默认会显示当月第一天,哪怕你选中了其他日期。

解决步骤

只需要在CalendarConstraints.Builder中添加setOpenAt(today)方法,这个方法会强制日历打开时直接滚动到你指定的日期(这里就是当天),而不是默认的当月第一天。

修改后的完整代码

MaterialDatePicker.Builder startDateBuilder;
MaterialDatePicker startDatePicker;

startDateBuilder = MaterialDatePicker.Builder.datePicker();
startDateBuilder.setTitleText("Starting date");

long today = MaterialDatePicker.todayInUtcMilliseconds();

CalendarConstraints.Builder con = new CalendarConstraints.Builder();
CalendarConstraints.DateValidator dateValidator = DateValidatorPointForward.now();
con.setValidator(dateValidator); // 隐藏/禁用过去的日期
con.setStart(today); // 设置可选日期的起始点为今天
con.setOpenAt(today); // 关键配置:让日历打开时定位到当天的位置

startDateBuilder.setSelection(today);
startDateBuilder.setCalendarConstraints(con.build());
startDateBuilder.setTheme(R.style.MaterialCalendarTheme); // 自定义主题

startDatePicker = startDateBuilder.build();
startDatePicker.show(getSupportFragmentManager(), startDatePicker.toString());

代码说明

  • setSelection(today):设置默认选中的日期为当天
  • setStart(today):限制用户只能选择当天及以后的日期
  • setOpenAt(today):控制日历初始显示的位置,确保打开时就定位到当天所在的月份区域,头部也会正常显示当前月份

这样修改后,你再次打开日期选择器时,就会直接看到当天所在的日历视图,而不是默认的当月第一天了。

内容的提问来源于stack exchange,提问作者RaJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:37:53