背景
在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):单元在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)?
4 回答
Oxff000000
在Kotlin中解析为Long,所以现在没有办法按原样使用这个文字,但0xff000000.toInt()
会给你与-0x1000000
完全相同的结果,所以你可以使用.toInt()
方法 . 在引擎盖下,它相当于(int)4278190080L
Java强制转换 .此外,使用Kotlin扩展,您可以编写类似的简单属性
并且你将能够使用更简洁的语法
textView.textColor = 0xff000000
UPDATE :从Kotlin 1.3开始,可以使用简洁的语法
0xff000000u
参见:Jetbrains blog和original proposaltoColor()在下面定义的扩展函数中 .
您可以尝试以编程方式设置文本的颜色 .