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

and*_*per 4 android textview kotlin

背景

在Java中,我可以使用它的标准十六进制值直接更改TextView的文本颜色:

    textView.setTextColor(0xffffffff); //white
    textView.setTextColor(0x00000000); //transparent
    textView.setTextColor(0xff000000); //black
    textView.setTextColor(0xff0000ff); //blue
    //etc...
Run Code Online (Sandbox Code Playgroud)

很容易...

问题

在Kotlin上,如果我尝试编写这样的东西,则会遇到奇怪的构建错误:

错误:(15,18)使用提供的参数无法调用以下函数:public open fun setTextColor(p0:ColorStateList!):android.widget.TextView中定义的单元public open fun setTextColor(p0:Int):单位在android.widget.TextView中定义

我尝试过的

我尝试通过Internet搜索此内容,但没有看到关于十六进制值的任何特殊信息。好像在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
Run Code Online (Sandbox Code Playgroud)

在我看来,用于Kotlin的Integer的十六进制值是带符号的,而在Java上,它会自动转换为带符号的十六进制,因此这会导致值翻转,并且需要在需要时设置减号。

我唯一能想到的仍然是这样的东西:

textView.setTextColor(Integer.parseUnsignedInt("ffff0000",16));
Run Code Online (Sandbox Code Playgroud)

但是,这有多个缺点:

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

问题

为什么会发生?

我该如何做才能使其在不进行字符串转换的情况下最易读,并且可以在所有Android版本上使用(在我的情况下为minSdkVersion 14)?

Imt*_*pto 6

要更改文本颜色,您可以按照此操作 -

textView.setTextColor(ContextCompat.getColor(applicationContext,R.color.colorAccent))
Run Code Online (Sandbox Code Playgroud)


Yog*_*yal 5

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

textview.textColor=Color.parseColor("#22aadd")
Run Code Online (Sandbox Code Playgroud)


Dmi*_*kov 5

Oxff000000在Kotlin中被解析为Long,所以现在无法按原样使用此文字,但是0xff000000.toInt()将为您提供与-0x1000000使用.toInt()方法完全相同的结果。在幕后,它等效于(int)4278190080LJava cast。

另外,通过Kotlin扩展,您可以编写一个简单的属性,例如

var TextView.textColor: Long
get() {
    //... not important
}
set(value: Long) {
    this.setTextColor(value.toInt())
}
Run Code Online (Sandbox Code Playgroud)

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

更新:从Kotlin 1.3开始,将可以使用像这样的简洁语法:0xff000000u 请参阅:Jetbrains博客原始建议


kik*_*sse 5

textView.setTextColor(Color.parseColor("#0aad3f"))
Run Code Online (Sandbox Code Playgroud)


Joo*_*ozd 4

很抱歉在这样一个老问题上添加一些内容,但扩展函数确实看起来是最好的方法:

fun TextView.setTextColor(color: Long) = this.setTextColor(color.toInt())
Run Code Online (Sandbox Code Playgroud)

现在,你可以再去textView.setTextColor(0xff00ff00)一次