动态访问Kotlin类属性 [英] Accessing dynamically to a Kotlin class property

查看:155
本文介绍了动态访问Kotlin类属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想为RecyleView中的文本视图动态设置backgroundColor,因此并非我的所有商品的标签都具有相同的背景色.

I want to set dynamically a backgroundColor to a text view in a RecyleView, and thus not all my item will have the same background color for their tag.

这是我想使用的伪代码:

This is the pseudo code I'd like to use :

val name = item.type.toLowerCase()
color = ContextCompat(item.context, R.color[name])

但是这种语法在Kotlin中似乎不起作用,而且我真的不知道如何根据项目的类型从资源中获取颜色值.

But this syntax does not seem to work in Kotlin, and I really have no idea how to fetch the color value from the resource depending on the type of the item.

我也尝试过:

val lowerType = pokemon.type.toLowerCase()
val id = holder.context.resources.getIdentifier(lowerType, "id", holder.context.packageName)
val color = ContextCompat.getColor(holder.context, id)

但这也会崩溃

推荐答案

以动态方式访问资源不是一个好主意,您将失去编译时的安全性和代码完成.对于您的情况,您可以创建一个 Map ,将每种视图类型与所需的资源(即 color )相关联.

It's not a good idea to access the resources in a dynamic way, you will lose compile-time safety and code completion. In your case, you could create a Map that associates every view type to the resource you want (i.e. color).

示例

/* colors.xml */
<color name="color_view_1">#AA000000</color>
<color name="color_view_2">#AB000000</color>
<color name="color_view_3">#AC000000</color>
<color name="color_view_4">#AD000000</color>
<color name="color_view_default">#AE000000</color>

/* Adapter */
enum class ViewType {
    TYPE1, TYPE2, TYPE3
}

val colors = mapOf(
    ViewType.TYPE1 to R.color.color_view_1,
    ViewType.TYPE2 to R.color.color_view_2,
    ViewType.TYPE3 to R.color.color_view_3
)

/* onBindViewHolder */
val color = colors[viewType] ?: R.color.color_view_default

这篇关于动态访问Kotlin类属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆