如何从android资源colors.xml创建颜色枚举(int)

Posted

技术标签:

【中文标题】如何从android资源colors.xml创建颜色枚举(int)【英文标题】:How to create enum of colors (int) from android resource colors.xml 【发布时间】:2021-11-13 19:46:03 【问题描述】:

我正在尝试将 xml 颜色访问到枚举中。 因为我无法访问上下文。我不知道如何从资源中访问颜色。

颜色可以是任何形式(它们可以作为 int 或颜色检索)

到目前为止,我有这样的东西

enum class NotificationType(val color: Int)
    //    DANGER("#F97068"),
    //    WARNING("#D1D646"),
    //    INFO("#BEBEBE"),
    //    SUCCESS("#76D13A")

【问题讨论】:

【参考方案1】:

您可以使用 int 颜色资源而不是十六进制表示:

enum class NotificationType(val color: Int) 
    DANGER(R.color.danger), 
    WARNING(R.color.warning), 
    INFO(R.color.info), 
    SUCCESS(R.color.success);

colors.xml:

<resources>
    <color name="danger">#F97068</color>
    <color name="warning">#D1D646</color>
    <color name="info">#BEBEBE</color>
    <color name="success">#76D13A</color>
</resources>

更新:

@Tenfour04 的好建议,您可以添加一个实用方法来从某个枚举值中获取颜色:

enum class NotificationType(val color: Int) 
    DANGER(R.color.danger),
    WARNING(R.color.warning),
    INFO(R.color.info),
    SUCCESS(R.color.success);

    fun toArgb(context: Context) =
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            context.resources.getColor(color, null)
        else
            context.resources.getColor(color) // Deprecated in API level 23

用法:

val color = NotificationType.DANGER.toArgb(context)

【讨论】:

您还可以在类中添加一个函数,用于使用 Context 检索实际颜色。 fun toArgb(context: Context) = context.resources.getColor(color) 但我认为更好的属性名称是colorResId,这样它就不太可能与颜色混淆,它也是 Int 类型。

以上是关于如何从android资源colors.xml创建颜色枚举(int)的主要内容,如果未能解决你的问题,请参考以下文章

xml 材料设计调色板Colors.xml Android的资源文件

Xamarin Android:以编程方式从 colors.xml 获取颜色值

动态更改 colors.xml 的值以更改 android 应用程序的外观

如何创建单独的 colors.xml 文件

Android应用架构分析

Android - 无法使用 ListFragement 设置 LIstView 背景颜色