Динамический доступ к свойству класса Kotlin - PullRequest
0 голосов
/ 18 января 2019

Я хочу динамически установить backgroundColor для текстового представления в 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)

Но это тоже вылетает

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Вы должны установить "color", а не "id" для getIdentifier() второго аргумента:

val id = holder.context.resources.getIdentifier(lowerType, "color", holder.context.packageName)
0 голосов
/ 18 января 2019

Динамический доступ к ресурсам - плохая идея, вы потеряете безопасность во время компиляции и завершение кода. В вашем случае вы могли бы создать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...