如何基于Android的colors.xml资源创建int类型的颜色枚举类
方案1:枚举存储颜色资源ID,使用时再解析(最推荐,无需全局Context)
你不需要在枚举定义阶段就解析出实际色值,只需要存储对应colors.xml的资源ID即可,使用枚举的场景大概率可以拿到Context(比如Activity、Fragment、View相关逻辑),用的时候再解析就能得到目标色值,还可以自动适配不同主题、深色模式、配置变更下的颜色定义:
enum class NotificationType(@ColorRes val colorResId: Int){ DANGER(R.color.notification_danger), WARNING(R.color.notification_warning), INFO(R.color.notification_info), SUCCESS(R.color.notification_success) }
使用示例:
- 获取Int类型色值:
val dangerColor = ContextCompat.getColor(context, NotificationType.DANGER.colorResId) - 获取Color对象:
val dangerColorObj = Color.valueOf(ContextCompat.getColor(context, NotificationType.DANGER.colorResId))
方案2:全局Application Context预解析(无需每次使用传Context)
如果确实希望枚举里直接存储解析完成的Int色值,可以先在自定义Application中缓存全局Context实例,枚举初始化时直接调用全局Context解析资源:
- 先自定义Application类:
class MyApp : Application() { companion object { lateinit var appContext: Context private set } override fun onCreate() { super.onCreate() appContext = this } }
- 在AndroidManifest.xml的application标签中声明自定义Application:
android:name=".MyApp" - 修改枚举类实现:
enum class NotificationType(val color: Int){ DANGER(ContextCompat.getColor(MyApp.appContext, R.color.notification_danger)), WARNING(ContextCompat.getColor(MyApp.appContext, R.color.notification_warning)), INFO(ContextCompat.getColor(MyApp.appContext, R.color.notification_info)), SUCCESS(ContextCompat.getColor(MyApp.appContext, R.color.notification_success)) }
注意:需要保证枚举的第一次初始化是在Application的onCreate执行完成之后,否则会触发未初始化异常。
方案3:无需Context直接硬编码色值(仅适用于无需适配多配置的场景)
如果你的颜色不需要随主题、深色模式等配置变化,也不想依赖Context,可以直接把colors.xml中的十六进制色值转成ARGB Int硬编码到枚举中:
enum class NotificationType(val color: Int){ DANGER(0xFFF97068.toInt()), WARNING(0xFFD1D646.toInt()), INFO(0xFFBEBEBE.toInt()), SUCCESS(0xFF76D13A.toInt()) }
需要Color对象时直接调用Color.valueOf(NotificationType.DANGER.color)即可,全程不需要Context参与。
内容的提问来源于stack exchange,提问作者Raj Rajput
相关产品推荐
相关产品推荐

