使用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的一个或你的),相同的属性名称不同的行为是不是一个好主意。