使用Kotlin& amp ;;访问资源ID安口

时间:2016-04-18 13:17:42

标签: kotlin anko

嘿伙计我是Android / Kotlin / Anko的新手,我有一个关于从Anko中访问颜色(可能还有其他)资源的方法的问题。

我知道有像textResource这样的帮助器,你只需传递R.string.my_color来简化设置资源字符串的过程,但是如何使用Resources实例来访问颜色View 1}} class?

假设您有Button的子类并想要更改文本颜色。如果您使用textResource,它将更改文本字符串而不是颜色,如果您使用textColor,则必须使用resources.getColor(R.color.my_color, null)指定真实资源ID,这不会太烦人如果您不必传递可选主题参数(此处为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))

1 个答案:

答案 0 :(得分:2)

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

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