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

时间:2017-10-29 14:41:25

标签: android textview kotlin

背景

在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公开开放的乐趣   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上它会自动转换为有符号值,因此这会导致值的翻转以及需要时设置减号的需要。 p>

我唯一能想到的,仍然可以很好地阅读它,就像这样:

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

然而,这有许多缺点:

  1. 时间更长。
  2. 它转换一个字符串,因此效率低得多
  3. 最重要的是:它仅适用于API 26(Android O),目前在全球约1%的Android设备上有效。
  4. 问题

    为什么会发生?

    我究竟能做些什么来使其最具可读性,没有字符串转换,并且适用于所有Android版本(在我的情况下为minSdkVersion 14)?

6 个答案:

答案 0 :(得分:5)

Oxff000000已解决为Kotlin中的Long,因此现在无法按原样使用此字面值,但0xff000000.toInt()将为您提供与-0x1000000完全相同的结果,因此您可以使用.toInt()方法。 在幕后,它相当于(int)4278190080L Java演员。

此外,使用Kotlin扩展,您可以编写一个简单的属性

var TextView.textColor: Long
get() {
    //... not important
}
set(value: Long) {
    this.setTextColor(value.toInt())
}

您将能够使用更简洁的语法textView.textColor = 0xff000000

<强>更新: 从Kotlin 1.3开始,可以使用像0xff000000u这样的简洁语法 请参阅:Jetbrains blogoriginal proposal

答案 1 :(得分:2)

textView.setTextColor(Color.parseColor("#0aad3f"))

答案 2 :(得分:2)

很抱歉在这样一个老问题上提出了一些问题,但是扩展功能确实是最好的方法:

fun TextView.setTextColor(color: Long) = this.setTextColor(color.toInt())

现在,您可以再次进入textView.setTextColor(0xff00ff00)

答案 3 :(得分:1)

textview.setTextColor("#ffffff".toColor())
下面定义的扩展函数中的

toColor()。

fun String.toColor(): Int = Color.parseColor(this)

答案 4 :(得分:0)

您可以尝试以编程方式设置文本的颜色。

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

答案 5 :(得分:0)

要更改文本颜色,可以遵循此-

textView.setTextColor(ContextCompat.getColor(applicationContext,R.color.colorAccent))