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

Android应用:为日历指定日期添加事件并高亮该日期

嘿,我来帮你搞定这个Android日历展示事件并高亮日期的问题!下面是一步步的具体实现方案:

实现Android日历展示事件并高亮日期的完整方案

第一步:从SQLite读取已保存的事件日期

首先得把你存在本地SQLite里的事件日期取出来,建议封装一个数据库操作类,比如EventDbHelper,写个专门的方法获取所有事件的日期集合:

public List<Date> getAllEventDates() {
    List<Date> eventDates = new ArrayList<>();
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.query(EVENTS_TABLE, new String[]{DATE_COLUMN}, null, null, null, null, null);
    
    if (cursor.moveToFirst()) {
        do {
            // 这里根据你实际存储的日期格式调整,比如存的是时间戳就转成Date
            long timestamp = cursor.getLong(cursor.getColumnIndexOrThrow(DATE_COLUMN));
            eventDates.add(new Date(timestamp));
        } while (cursor.moveToNext());
    }
    cursor.close();
    db.close();
    return eventDates;
}

第二步:选择日历组件并实现高亮

方案一:用原生CalendarView(稍复杂)

原生CalendarView没有直接的高亮API,得自定义子类重写绘制逻辑:

public class CustomCalendarView extends CalendarView {
    private List<Long> eventTimestamps;

    public CustomCalendarView(Context context) {
        super(context);
        initEventDates();
    }

    public CustomCalendarView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initEventDates();
    }

    private void initEventDates() {
        EventDbHelper dbHelper = new EventDbHelper(getContext());
        List<Date> eventDates = dbHelper.getAllEventDates();
        eventTimestamps = eventDates.stream().map(Date::getTime).collect(Collectors.toList());
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 这里需要计算每个日期的坐标,判断是否属于事件日期后绘制高亮背景
        // 原生CalendarView的绘制逻辑较深,如果嫌麻烦更推荐用下面的第三方库方案
    }
}

方案二:用Material Calendar View(简单高效)

这是谷歌推荐的第三方日历库,高亮实现非常省心:

  1. 先在build.gradle里加依赖:
implementation 'com.prolificinteractive:material-calendarview:1.4.3'
  1. 布局里添加组件:
<com.prolificinteractive.materialcalendarview.MaterialCalendarView
    android:id="@+id/calendarView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
  1. 在日历页面的Activity里设置高亮:
MaterialCalendarView calendarView = findViewById(R.id.calendarView);
EventDbHelper dbHelper = new EventDbHelper(this);
List<Date> eventDates = dbHelper.getAllEventDates();

// 把Date转成库需要的CalendarDay对象
List<CalendarDay> eventDays = eventDates.stream()
        .map(date -> CalendarDay.from(date))
        .collect(Collectors.toList());

// 添加自定义装饰器实现高亮
calendarView.addDecorator(new EventDecorator(getResources().getColor(R.color.highlight_red), eventDays));
  1. 自定义高亮装饰器类:
public class EventDecorator implements DayViewDecorator {
    private final int highlightColor;
    private final HashSet<CalendarDay> eventDays;

    public EventDecorator(int color, Collection<CalendarDay> dates) {
        this.highlightColor = color;
        this.eventDays = new HashSet<>(dates);
    }

    @Override
    public boolean shouldDecorate(CalendarDay day) {
        return eventDays.contains(day);
    }

    @Override
    public void decorate(DayViewFacade view) {
        // 设置日期背景高亮,你可以自己写个drawable作为高亮样式
        view.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.calendar_highlight_bg));
        // 也可以单独改文字颜色
        view.addSpan(new ForegroundColorSpan(highlightColor));
    }
}

然后在drawable文件夹里创建calendar_highlight_bg.xml,比如做个圆形高亮背景:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="@color/highlight_red"/>
    <size android:width="32dp" android:height="32dp"/>
</shape>

第三步:关联AddEventActivity的保存操作

当你在AddEventActivity里保存完事件后,要让日历页面刷新高亮。最简单的方式是在日历页面的onResume方法里重新加载事件日期并更新装饰器:

@Override
protected void onResume() {
    super.onResume();
    updateCalendarHighlights();
}

private void updateCalendarHighlights() {
    EventDbHelper dbHelper = new EventDbHelper(this);
    List<Date> eventDates = dbHelper.getAllEventDates();
    List<CalendarDay> eventDays = eventDates.stream()
            .map(date -> CalendarDay.from(date))
            .collect(Collectors.toList());
    
    calendarView.removeDecorators(); // 先移除旧的装饰器
    calendarView.addDecorator(new EventDecorator(getResources().getColor(R.color.highlight_red), eventDays));
}

这样就能实现:添加事件后回到日历页面,对应日期自动高亮显示啦!如果有日期格式转换、SQLite存储优化这类细节问题,随时调整就行~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:44:09