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

如何从Material Calendar View中移除选中日期及装饰器?

解决Material Calendar无法通过removeDecorator()移除选中日期装饰的问题

之前尝试用removeDecorator()方法移除Material Calendar里选中日期的装饰效果,但没起到作用。我折腾了一阵,用额外XML布局的方式解决了这个问题,步骤如下:

解决方案步骤

  • 1. 创建空装饰样式XML
    新建一个名为calendar_empty_decor.xml的drawable文件,让它完全透明,用来覆盖原来的选中装饰:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="@android:color/transparent" />
    <stroke android:width="0dp" android:color="@android:color/transparent" />
</shape>
  • 2. 实现空装饰器类
    写一个装饰器类,用上面的空样式替换目标日期的选中装饰:
public class EmptyDateDecorator implements DayViewDecorator {
    private final Drawable emptyDrawable;

    public EmptyDateDecorator(Context context) {
        emptyDrawable = ContextCompat.getDrawable(context, R.drawable.calendar_empty_decor);
    }

    @Override
    public boolean shouldDecorate(CalendarDay day) {
        // 这里传入你需要取消装饰的目标日期
        return day.equals(targetDayToRemoveDecoration);
    }

    @Override
    public void decorate(DayViewFacade view) {
        view.setSelectionDrawable(emptyDrawable);
    }
}
  • 3. 替换装饰器
    在需要移除选中装饰的逻辑里,先移除原有的选中装饰器,再添加这个空装饰器,最后刷新日历:
// 移除原选中装饰器(假设原装饰器实例为selectedDateDecorator)
calendarView.removeDecorator(selectedDateDecorator);
// 添加空装饰器覆盖样式
calendarView.addDecorator(new EmptyDateDecorator(this));
// 刷新装饰器生效
calendarView.invalidateDecorators();

如果有更简洁或者更符合Material Calendar设计逻辑的方法,欢迎在评论区分享。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 08:30:24