使用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的一个或你的),相同的属性名称不同的行为是不是一个好主意。
- 如何通过自定义的webView取代webView?
- 类型干扰失败。 期望的类型不匹配:必需的字符串在Kotlin和Anko中找到pair <String,String>
- 在Anko DSL中创建一个自定义View / ViewGroup类
- 如何通过自定义的webView取代webView?
- Kotlin / anko多个异步任务
- 使用Anko获取类型不匹配错误需要AnkoContext <ViewGroup>找到AnkoContext <Context>
- Kotlin:如何使用Anko DSL制作工具栏菜单?
- Kotlin anko通用选择器在提供的示例中不起作用
- 你怎么得到一个Idlingresource工作在Kotlin与协程