kotlin - 动态访问 Kotlin 类属性
问题描述
我想为 RecyleView 中的文本视图动态设置背景颜色,因此并非我的所有项目的标签都具有相同的背景颜色。
这是我想使用的伪代码:
val name = item.type.toLowerCase()
color = ContextCompat(item.context, R.color[name])
但是这种语法在 Kotlin 中似乎不起作用,我真的不知道如何根据项目的类型从资源中获取颜色值。
我也试过这个:
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)相关联。
例子
/* 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
推荐阅读
- javascript - 如何在字符串数组中找到最长的公共前缀?
- reactjs - 使用反应测试库和 Jest 测试 Amplify Cognito Auth.SignIn()
- python - 带有字母数字和破折号的正则表达式,没有前导和尾随破折号
- matplotlib - 将 2 个不同的蒙版应用于 seaborn 热图或手动更改单元格的颜色
- c# - 尝试对 ASP.NET Core 3.1 使用多个身份验证方案时出现异常
- r - R:Facet_Grid 标签放置
- javascript - 如果我不按住鼠标左键单击,输入字段会失去焦点
- c# - 带有 ChromeDriver 的 C# 无头代理身份验证
- c - 在 C 中匹配 Python 模数/余数
- kubernetes - 如何在 kubernetes 密钥中使用连字符键和连字符?