使用Kotlin&;访问资源ID;安科
我是Android/Kotlin/Anko新手,我对如何从Anko内部访问颜色(可能还有其他)资源有疑问 我知道有像使用Kotlin&;访问资源ID;安科,kotlin,anko,Kotlin,Anko,我是Android/Kotlin/Anko新手,我对如何从Anko内部访问颜色(可能还有其他)资源有疑问 我知道有像textResource这样的帮助程序,您只需传递R.string.my_color即可简化设置资源字符串的过程,但是如何使用视图类中的资源实例访问颜色呢 假设您有一个子类Button,并希望更改文本颜色。如果您使用textResource它将更改文本字符串而不是颜色,如果您使用textColor则必须使用resources.getColor(R.color.my_color,nu
textResource
这样的帮助程序,您只需传递R.string.my_color
即可简化设置资源字符串的过程,但是如何使用视图
类中的资源
实例访问颜色呢
假设您有一个子类Button
,并希望更改文本颜色。如果您使用textResource
它将更改文本字符串而不是颜色,如果您使用textColor
则必须使用resources.getColor(R.color.my_color,null)
指定真正的资源ID,如果您不必传递可选的主题参数(null
,此处)
在资源上创建扩展在这里有用吗
fun Int.fromResources(resources: Resources): Int {
return resources.getColor(this, null)
}
推荐的方法是什么
编辑
我更改了textColor
值扩展名来实现这一点,我发现这是最干净的做法,只是我不知道这是否真的对Android友好
我认为您可以使用这样的属性扩展,而不是您建议的属性扩展:
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
:
- 允许您直接设置颜色,而无需从XML获取颜色(如果需要)
- 防止您导入错误的
textColor
(Anko的或您的),相同的属性名称具有不同的行为不是一个好主意
我建议使用ContextCompat.getColor(context,R.color.color\u id)
代替resources.getColor(v,null)
var TextView.textColorRes: Int
get() = throw PropertyWithoutGetterException("textColorRes")
set(@ColorRes v) = setTextColor(ContextCompat.getColor(context, v))