如何根据字符串资源显示值获取对应的ColorEnum枚举实例?
根据字符串资源显示值获取枚举实例的解决方案
因为ColorEnum.valueOf()仅支持根据枚举项名称(比如blu)查找实例,而你现在需要根据字符串资源的显示值(比如Blue)匹配,核心思路是建立枚举项与对应显示值的关联,通过遍历或预存映射的方式实现查找。
方法1:实时遍历枚举项(适合多语言动态场景)
直接遍历所有枚举项,通过Context获取每个枚举项对应的字符串资源显示值,与目标字符串匹配:
enum class ColorEnum( @StringRes val textResource: Int ) : Abbrev { blu(R.string.blue), red(R.string.red), grn(R.string.green); // 示例枚举项 companion object { /** * 根据显示值查找对应枚举实例,未找到返回null * @param context 用于获取字符串资源的上下文 * @param displayValue 目标显示值(如"Blue") * @param ignoreCase 是否忽略大小写匹配,默认false */ fun fromDisplayValue( context: Context, displayValue: String, ignoreCase: Boolean = false ): ColorEnum? { return values().firstOrNull { context.getString(it.textResource).equals(displayValue, ignoreCase) } } /** * 根据显示值查找对应枚举实例,未找到抛出NoSuchElementException */ fun fromDisplayValueOrThrow( context: Context, displayValue: String, ignoreCase: Boolean = false ): ColorEnum { return values().first { context.getString(it.textResource).equals(displayValue, ignoreCase) } } } }
使用示例
val colorString = "Blue" // 安全查找,返回可空类型 val colorEnum: ColorEnum? = ColorEnum.fromDisplayValue(context, colorString) // 强制查找,确保存在时使用 val colorEnum: ColorEnum = ColorEnum.fromDisplayValueOrThrow(context, colorString)
优点
- 无需提前初始化,随系统语言动态更新匹配结果,适配多语言切换场景
- 实现简单,无需额外维护映射表
缺点
- 每次查找都要遍历所有枚举项,枚举项数量较多时性能略差
方法2:预存显示值-枚举映射表(适合枚举项固定、性能优先场景)
提前构建显示值到枚举实例的映射表,后续查找直接从Map中取值,提升性能:
enum class ColorEnum( @StringRes val textResource: Int ) : Abbrev { blu(R.string.blue), red(R.string.red), grn(R.string.green); companion object { private lateinit var displayValueMap: Map<String, ColorEnum> /** * 初始化映射表,建议在Application的onCreate中调用 */ fun init(context: Context) { displayValueMap = values().associate { context.getString(it.textResource) to it } } /** * 根据显示值查找对应枚举实例,未找到返回null * 注意:必须先调用init(context)初始化映射表 */ fun fromDisplayValue(displayValue: String): ColorEnum? { check(::displayValueMap.isInitialized) { "ColorEnum must be initialized with init(context) first" } return displayValueMap[displayValue] } } }
使用步骤
- 在Application中初始化映射表:
class MyApplication : Application() { override fun onCreate() { super.onCreate() ColorEnum.init(this) } }
- 查找枚举实例:
val colorString = "Blue" val colorEnum: ColorEnum? = ColorEnum.fromDisplayValue(colorString)
优点
- 查找速度快,适合枚举项数量较多的场景
缺点
- 映射表初始化后不会随语言切换自动更新,若支持多语言切换,需在语言变更时重新调用
init(context)更新映射表 - 需要提前初始化,增加了调用成本
注意事项
- 大小写匹配:根据业务需求选择是否开启
ignoreCase参数,比如允许"blue"匹配"Blue"时设置为true - 多语言适配:若应用支持多语言,方法1的动态遍历方式更稳妥;方法2需在语言切换时重新初始化映射表
内容的提问来源于stack exchange,提问作者Ralf Wickum
相关产品推荐
相关产品推荐

