嘿伙计我是Android / Kotlin / Anko的新手,我有一个关于从Anko中访问颜色(可能还有其他)资源的方法的问题。
我知道有像textResource
这样的帮助器,你只需传递R.string.my_color
来简化设置资源字符串的过程,但是如何使用Resources
实例来访问颜色View
1}} class?
假设您有Button
的子类并想要更改文本颜色。如果您使用textResource
,它将更改文本字符串而不是颜色,如果您使用textColor
,则必须使用resources.getColor(R.color.my_color, null)
指定真实资源ID,这不会太烦人如果您不必传递可选主题参数(此处为null
)
在Resources
创建扩展程序在这里有用吗?
fun Int.fromResources(resources: Resources): Int {
return resources.getColor(this, null)
}
推荐的方式是什么?
编辑
我更改了textColor
值扩展名来做到这一点,我找到了最干净的事情,除了我不知道这是否真的 Android 友好
var android.widget.TextView.textColor: Int
get() = throw AnkoException("'android.widget.TextView.textColor' property does not have a getter")
set(v) = setTextColor(resources.getColor(v, null))
答案 0 :(得分:2)
我认为你可以使用像这样的属性扩展而不是你建议的那个:
var TextView.textColorRes: Int
get() = throw PropertyWithoutGetterException("textColorRes")
set(@ColorRes v) = setTextColor(resources.getColor(v, null))
或者按照Damian Petla的建议使用ContextCompat
:
var TextView.textColorRes: Int
get() = throw PropertyWithoutGetterException("textColorRes")
set(@ColorRes v) = setTextColor(ContextCompat.getColor(context, v))
你应该保留Anko的textColor
:
textColor
(Anko的一个或多个),具有不同行为的相同属性名称不是一个好主意。