Caldroid日历单元格中ColorDrawable始终显示紫色问题求助
问题分析与解决方案
嘿,我一眼就发现问题所在啦!你在使用ColorDrawable的时候犯了个常见的小错误,这就是所有Drawable都显示成紫色的核心原因~
核心错误:误用ColorDrawable构造函数
ColorDrawable的设计是用来创建纯色背景的Drawable,它的构造参数需要的是颜色的整数值(比如Color.BLACK或者通过ContextCompat.getColor()获取的资源颜色值),但你现在传的是R.drawable.black这种Drawable资源的ID——这个ID本质是个整数,系统会把它当成颜色值来解析,而这个整数刚好对应到紫色的颜色值,所以所有Drawable都显示成了紫色。
另外,你那些带红色边框的Shape Drawable本身就是完整的Drawable实例,根本不需要用ColorDrawable来包装,直接使用即可。
修正后的代码示例
第一步:正确初始化Drawable
// 纯色背景:用ColorDrawable,传入正确的颜色值 ColorDrawable black = new ColorDrawable(ContextCompat.getColor(getContext(), R.color.Black)); ColorDrawable green = new ColorDrawable(ContextCompat.getColor(getContext(), R.color.Green)); ColorDrawable yellow = new ColorDrawable(ContextCompat.getColor(getContext(), R.color.Yellow)); ColorDrawable blue = new ColorDrawable(ContextCompat.getColor(getContext(), R.color.Blue)); // 带边框的Shape Drawable:直接获取Drawable实例,无需ColorDrawable包装 Drawable blackBordered = ContextCompat.getDrawable(getContext(), R.drawable.red_border_for_black); Drawable greenBordered = ContextCompat.getDrawable(getContext(), R.drawable.red_border_for_green); Drawable yellowBordered = ContextCompat.getDrawable(getContext(), R.drawable.red_border_for_yellow); Drawable blueBordered = ContextCompat.getDrawable(getContext(), R.drawable.red_border_for_blue);
第二步:确保颜色资源正确定义
检查你的res/values/colors.xml里是否有对应的颜色值(如果没有的话需要添加):
<color name="Black">#FF000000</color> <color name="Green">#FF00FF00</color> <color name="Yellow">#FFFFFF00</color> <color name="Blue">#FF0000FF</color> <color name="Red_For_Border">#FFFF0000</color> <color name="White">#FFFFFFFF</color>
第三步:原有逻辑代码无需改动
你后面的日期判断和setBackgroundDrawableForDate、setTextColorForDate的调用逻辑是没问题的,直接保留即可。
额外优化建议
其实你那些不带边框的纯色背景,完全不需要写Shape Drawable(比如R.drawable.black),直接用ColorDrawable传入颜色值就足够了,这样还能减少资源文件的数量,提升性能。
内容的提问来源于stack exchange,提问作者Owen Scott
相关产品推荐
相关产品推荐

