使用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)) 

One Solution collect form web for “使用Kotlin和Anko访问资源ID”

我想你可以使用像这样的属性扩展,而不是你建议的:

 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的一个或你的),相同的属性名称不同的行为是不是一个好主意。
  • 在Kotlin函数调用中使用默认参数值
  • 得到未解决的参考:将java转换为kotlin时的setText
  • 正则表达式:识别任何类型的字符的元字符
  • Kotlin 2d数组初始化
  • Kotlin,如何测试(int)数组
  • Kotlin初始化一个对象
  • 将通道桥接到一个序列
  • 如何映射java.util.Optional <Something>到某些东西? 在Kotlin
  • 从表达式中断或返回
  • 使用Gradle Kotlin配置Maven插件
  • 在Kotlin的表达声明
  • Kotlin language will be the best programming language for Android.