使用Kotlin和Anko访问资源ID
嗨,大家好我是Android / Kotlin / Anko的新手,我有一个关于如何访问Anko内部的颜色(也可能是其他)资源的问题。
我知道有一些像textResource
这样的textResource
,只需传递R.string.my_color
来简化设置资源字符串的过程,但是如何使用View
类的Resources
实例访问颜色呢?
假设您有Button
的子类,并且想要更改文本颜色。 如果你使用textResource
它会改变文本字符串而不是颜色,如果你使用textColor
那么你必须使用resources.getColor(R.color.my_color, null)
来指定真实的资源ID resources.getColor(R.color.my_color, null)
这将不会如此讨厌你不必传递可选的主题参数(这里是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))
我想你可以使用像这样的属性扩展,而不是你建议的:
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的一个或你的),相同的属性名称不同的行为是不是一个好主意。