首页 文章

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

提问于
浏览
3

背景

在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 回答

  • 0

    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

    UPDATE :从Kotlin 1.3开始,可以使用简洁的语法 0xff000000u 参见:Jetbrains blogoriginal proposal

  • 1
    textview.setTextColor("#ffffff".toColor())
    

    toColor()在下面定义的扩展函数中 .

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

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

    textview.textColor=Color.parseColor("#22aadd")
    
  • 0
    textView.setTextColor(Color.parseColor("#0aad3f"))
    

相关问题