来自 Kotlin 基础课程,我们有以下代码:
@BindingAdapter("sleepImage")
fun ImageView.setSleepImage(item: SleepNight?) {
item?.let {
setImageResource(when (item.sleepQuality) {
0 -> R.drawable.ic_sleep_0
1 -> R.drawable.ic_sleep_1
2 -> R.drawable.ic_sleep_2
3 -> R.drawable.ic_sleep_3
4 -> R.drawable.ic_sleep_4
5 -> R.drawable.ic_sleep_5
else -> R.drawable.ic_sleep_active
})
}
}
在其他语言中,我可以通过使用 sleepQuality
整数来查找匹配的元素,例如在 Typescript 中:
setImageResource(R.drawable[`ic_sleep_${item.sleepQuality}`] ?? R.drawable.ic_sleep_active)
即使我尝试着开始,我的第一步也无法编译:
0 -> R.drawable["ic_sleep_0"] // doesn't compile
这种操作在Kotlin中是否可行?
编辑/更新
这里有几个不错的回答。
看起来对于这个特定的用例,我可以通过字符串查找资源,类似于我正在尝试的:
val resId = context.resources.getIdentifier("ic_sleep_${item.sleepQuality}", "drawable", context.packageName)
然而,这并不是通用的解决方案。以下内容无效:
val x = item['sleepQuality']
正如一些回答中所提到的,这可以通过反射实现。具体怎么做呢?
LevelListDrawable
并修改它的级别。使用反射或字符串的getIdentifier
方法不能在编译时提供安全性,所以通常应该避免使用。 - Pawelresources.getIdentifier
在底层使用了反射。请注意,应避免使用反射,因为它会丢弃使用强类型语言的好处(编译器在运行代码之前就能捕获错误)。如果您一开始将可绘制对象存储在数组中,就不需要这个when
语句。 - Tenfour04