单一的TextView,具有多种颜色的文本

214

正如标题所述,我想知道是否有可能在单个textview元素中实现两种不同的颜色。


3
可能是 Is it possible to have multiple styles inside a TextView? 的重复问题。 - dogbane
2
这并不是重复问题,因为提问者特别询问了颜色。 - Iqbal
这方面有一个不错的库,我认为可以使用:https://blog.stylingandroid.com/rialto-downloadable-fonts/ https://github.com/StylingAndroid/Rialto - android developer
我也写了一些库,其行为类似于这个:https://github.com/ha-yi/MultiColorTextView - Hayi Nukman
23个回答

0
最好使用Spannable来改变颜色,并使用Regex查找要更改的文本。我不建议使用HtmlCompat,因为它会修改文本的结构。
当您修改文本时,请添加
textView.setText("textExample", BufferType.SPANNABLE)

准备正则表达式和颜色。
val regex = Regex("Example")
val color = ContextCompat.getColor(requireContext(), R.color.red)

我也建议您创建一个函数,以使它更简单。
private fun applyTint(textView:TextView, regex:Regex, intColor:Int) {

    val span : Spannable = textView.text.toSpannable()
    val values = regex.findAll(textView.text)

    for(value in values.iterator()){
        val range = value.range
        span.setSpan(
            ForegroundColorSpan(intColor),
            range.first,
            range.last+1,
            Spannable.SPAN_COMPOSING
        )
    }
}

最后调用你的函数。
applyTint(textView, regex, color)

结果是这样的:

CodeResult

如果您需要更多关于正则表达式的信息,请查阅文档https://developer.android.com/reference/java/util/regex/Pattern#summary-of-regular-expression-constructs


0

Kotlin中的构建器函数:

  val text = buildSpannedString {
      append("My red text")
      setSpan(
          ForegroundColorSpan(ContextCompat.getColor(requireContext(), R.color.red)),
          3,
          6,
          Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
      )
  }
  textView?.setText(text)

0

创建一个通用函数,将您的字符串转换为可跨度的格式。

//pass param textviewid ,start,end,string
//R.color.Red it's your color you can change it as requirement

fun SpannableStringWithColor(view: TextView,start:Int,end:Int, s: String) {
    val wordtoSpan: Spannable =
        SpannableString(s)
    wordtoSpan.setSpan(
        ForegroundColorSpan(ContextCompat.getColor(view.context, R.color.Red)),
        start,
        end,
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
    )
    view.text = wordtoSpan
    }

我们可以像这样根据需求在任何地方使用它。

 SpannableStringWithColor(tvMobileNo,0,14,"Mobile Number :   " + "123456789")

 SpannableStringWithColor(tvEmail,0,5,"Email :   " + "abc@gmail.com" "))

 SpannableStringWithColor(tvAddress,0,8,"Address :   " + "Delhi India")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接