如何在Kotlin for Android上使用“setTextColor(hexaValue)”,

背景

在Java中,我可以使用它的标准hex值直接更改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中定义

我试过了

我试图通过互联网搜索这个,我看不出有什么特别的hex值。 看起来像在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的hex值似乎是有符号的,而在Java上它会自动转换为带符号的值,所以这会导致值的翻转以及需要时设置一个负号。

我能想到的唯一的东西,仍然允许阅读,就像这样:

 textView.setTextColor(Integer.parseUnsignedInt("ffff0000",16)); 

但是,这有多个缺点:

  1. 这是更长的时间。
  2. 它转换一个字符串,所以效率要低得多
  3. 最重要的是:它仅适用于API 26(Android O),它目前在全球约1%的Android设备上处于活动状态。

问题

为什么会发生?

我能做些什么才能使其具有最好的可读性,而不需要字符串转换,并且可以在所有的Android版本上运行(在我的情况下是minSdkVersion 14)?

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

您可以尝试通过编程来设置文本的颜色。

 textview.textColor=Color.parseColor("#22aadd")