3

我是 Android/Kotlin/Anko 的新手,我对从 Anko 中访问颜色(可能还有其他)资源的方式有疑问。

我知道有一些帮助程序,例如textResource您只需传递R.string.my_color以简化设置资源字符串的过程,但是如何使用类中的Resources实例访问颜色View

假设您有一个子类Button并且想要更改文本颜色。如果你使用textResource它会改变文本字符串而不是颜色,如果你使用textColor那么你必须通过使用它来指定真实的资源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))
4

1 回答 1

2

我认为您可以使用像这样的属性扩展而不是您建议的扩展:

var TextView.textColorRes: Int
    get() = throw PropertyWithoutGetterException("textColorRes")
    set(@ColorRes v) = setTextColor(resources.getColor(v, null))

或者ContextCompat按照 Damian Petla 的建议使用:

var TextView.textColorRes: Int
    get() = throw PropertyWithoutGetterException("textColorRes")
    set(@ColorRes v) = setTextColor(ContextCompat.getColor(context, v))

你应该保留 Anko 的textColor

  • 如果在某些时候需要,允许您直接设置颜色而不从 XML 中获取
  • 防止您导入错误textColor的(Anko 的或您的),具有不同行为的相同属性名称不是一个好主意。
于 2016-05-05T15:13:22.230 回答