如何从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
相关产品推荐
相关产品推荐

