如何让Android Material CalendarView的setOnDateChangedListener仅响应特定日期?
解决Material CalendarView仅响应周六周日点击的问题
嘿,这个需求实现起来很简单,核心思路就是在setOnDateChangedListener的回调里先判断选中日期是周六还是周日,再决定是否启动Intent。下面给你两种常见的实现方式:
方式一:使用Java 8+的LocalDate(推荐)
这种方式代码更清晰易读,利用Java的LocalDate和DayOfWeek枚举来判断星期:
materialCalendarView.setOnDateChangedListener((widget, selectedDate, isSelected) -> { // 将CalendarDay转换为LocalDate LocalDate localDate = selectedDate.toLocalDate(); DayOfWeek day = localDate.getDayOfWeek(); // 判断是否是周六或周日 if (day == DayOfWeek.SATURDAY || day == DayOfWeek.SUNDAY) { // 在这里启动你的目标Activity Intent intent = new Intent(this, YourTargetActivity.class); // 可选:传递选中的日期数据 intent.putExtra("SELECTED_DATE", selectedDate); startActivity(intent); } // 非周六周日的情况,直接什么都不做 });
方式二:使用传统Calendar类
如果你的项目还在使用旧版Java,也可以用Calendar类来判断:
materialCalendarView.setOnDateChangedListener(new OnDateChangedListener() { @Override public void onDateChanged(@NonNull MaterialCalendarView widget, @NonNull CalendarDay date, boolean selected) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date.getDate()); int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); // Calendar类中,SUNDAY是1,SATURDAY是7 if (dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY) { Intent intent = new Intent(YourCurrentActivity.this, YourTargetActivity.class); startActivity(intent); } } });
额外提示
- 如果需要区分用户是选中还是取消选中日期,可以结合回调里的
isSelected参数调整逻辑,比如只有当isSelected为true时才处理。 - 记得替换代码中的
YourTargetActivity为你实际要启动的Activity类名。
内容的提问来源于stack exchange,提问作者matQ
相关产品推荐
相关产品推荐

