更改默认日历事件颜色



我正在尝试通过执行以下操作来插入具有不同默认颜色的事件:

public static void addReminder(Context context, String title,
        String description) {
    Intent intent = new Intent(Intent.ACTION_INSERT);
    intent.setData(Events.CONTENT_URI);
    intent.putExtra(Events.TITLE, title);
    intent.putExtra(Events.DESCRIPTION, description);
    intent.putExtra(Events.EVENT_COLOR, context.getResources().getColor(R.color.blue_belize_hole));
    context.startActivity(intent);
}

但新的"日历"页面以相同的红色(默认颜色)显示。我该如何更改它?

您可以通过创建新日历来更改它,因为颜色是按日历排序的。来源和操作方法可以在这里找到:安卓日历提供程序事件颜色

编辑:正如 stackoverflow-meta 所建议的那样(感谢链接 Kleopatra),我将引用原始答案,因为这将防止链接腐烂并且"立即对读者有帮助"。当我自己再次写那个答案时,这没有意义,还是吗?我的意思是,我的答案只是为了向人们展示另一个答案......

所以,以下都是Sphaso的引用(我不知道如何将其格式化为包含代码的引用):

好吧,我想那天晚上我被烧坏了。然而,万一其他人最终来到这里,据我所知,对日历>事件交互进行简要解释是公平的。

长话短说:事件颜色取决于您放入的日历。如果events_color列被日历颜色覆盖,为什么会有它?我知道。

因此,一旦您设置了花哨的同步适配器,用户等,您需要创建一个新的日历:

public long insertCalendar(EventType eventType) {
    Uri calUri = CalendarContract.Calendars.CONTENT_URI;
    ContentValues cv = new ContentValues();
    cv.put(CalendarContract.Calendars.ACCOUNT_NAME, "DUMMY");
    cv.put(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL);
    cv.put(CalendarContract.Calendars.NAME, eventType.getDescription());
    cv.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, eventType.getDescription());
    cv.put(CalendarContract.Calendars.CALENDAR_COLOR, Color.parseColor(eventType.getColor()));
    cv.put(CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_OWNER);
    cv.put(CalendarContract.Calendars.OWNER_ACCOUNT, true);
    cv.put(CalendarContract.Calendars.VISIBLE, 1);
    cv.put(CalendarContract.Calendars.SYNC_EVENTS, 1);
    //cv.put(CalendarContract.Calendars.CAL_SYNC1, eventType.getId());
    calUri = calUri.buildUpon()
        .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
        .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, "DUMMY")
        .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL)
        .build();
    Uri result = mContentResolver.insert(calUri, cv);
    return Long.parseLong(result.getLastPathSegment());
}

请注意,我在CALENDAR_COLOR列中放置了一种颜色,在这种情况下,我将#000000之类的内容解析为Color.BLACK。另请注意 ACCOUNT_TYPE 中的值。从我收集的信息来看,似乎没有其他方法可以解决这个问题。

public long insert(Event event, long calendarID) throws ParseException {
    EventTypeDal adapter = new EventTypeDal();
    EventType et = adapter.GetEventTypeById(event.getFkEventType());
    ContentValues eventValues = new ContentValues();
    eventValues.put("calendar_id", calendarID); 
    //eventValues.put(Events.SYNC_DATA1, event.getId());
    eventValues.put(Events.TITLE, event.getTitle());
    eventValues.put(Events.DESCRIPTION, et.getDescription());
    eventValues.put(Events.EVENT_TIMEZONE, "Europe/Rome");
    eventValues.put(Events.DTSTART, event.getStart().getTime());
    eventValues.put(Events.DTEND, event.getEnd().getTime());
    Uri eventUri = mContentResolver.insert(Uri.parse(eventUriString).buildUpon().appendQueryParameter(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER,"true").appendQueryParameter(Calendars.ACCOUNT_NAME, "DUMMY").appendQueryParameter(Calendars.ACCOUNT_TYPE, "accountType").build(), eventValues);
    return Long.parseLong(eventUri.getLastPathSegment());
}

现在我把一个事件放在日历中(日历ID参数)。此事件将以日历的颜色显示。

最新更新