如何在Kotlin for Android上使用“setTextColor(hexaValue)”,
背景
在Java中,我可以使用它的标准十六进制值直接更改TextView的文本颜色:
textView.setTextColor(0xffffffff); //white textView.setTextColor(0x00000000); //transparent textView.setTextColor(0xff000000); //black textView.setTextColor(0xff0000ff); //blue //etc...
好简单…
问题
在Kotlin上,如果我尝试写这样的东西,我得到一个奇怪的构建错误:
错误:(15,18)以下函数都不能用所提供的参数调用:public open fun setTextColor(p0:ColorStateList!):在android.widget.TextView中定义的单位public open fun setTextColor(p0:Int):Unit在android.widget.TextView中定义
我试过了
我试图通过互联网搜索这个,我看不出有什么特别的十六进制值。 看起来像在Java上一样:
https://kotlinlang.org/docs/reference/basic-types.html
然后我决定用Java编写,转换成Kotlin。 结果在颜色值方面是非常不可读的:
textView.setTextColor(-0x1) //white textView.setTextColor(0x00000000) //transparent textView.setTextColor(-0x1000000) //black textView.setTextColor(-0xffff01) //blue
对我来说,用于Kotlin的Integer的十六进制值似乎是有符号的,而在Java上它会自动转换为带符号的值,所以这会导致值的翻转以及需要时设置一个负号。
我能想到的唯一的东西,仍然允许阅读,就像这样:
textView.setTextColor(Integer.parseUnsignedInt("ffff0000",16));
但是,这有多个缺点:
- 这是更长的时间。
- 它转换一个字符串,所以效率要低得多
- 最重要的是:它仅适用于API 26(Android O),它目前在全球约1%的Android设备上处于活动状态。
问题
为什么会发生?
我能做些什么才能使其具有最好的可读性,无需字符串转换,并且可以在所有Android版本上运行(在我的情况下,minSdkVersion 14)?
您可以尝试通过编程来设置文本的颜色。
textview.textColor=Color.parseColor("#22aadd")
Oxff000000
在Kotlin中被解析为Long,所以现在没有办法使用这个字面值,但是0xff000000.toInt()
会给你和-0x1000000
完全一样的结果,所以你可以使用.toInt()
方法。 在引擎盖下,它相当于(int)4278190080L
Java cast。
另外,通过Kotlin扩展,您可以编写一个简单的属性
var TextView.textColor: Long get() { //... not important } set(value: Long) { this.setTextColor(value.toInt()) }
你将能够使用更简洁的语法textView.textColor = 0xff000000