本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

Android经典实战之Textview文字设置不同颜色、下划线、加粗、超链接等效果_view

SpannableString 在 Android 开发中是一个非常强大的工具,它允许你在单个字符串范围内应用多种样式。使用 SpannableString,你可以为文本中的不同部分设置不同颜色,字体大小,字体风格,甚至可以在文本的不同部分添加点击事件。

下面是一个详细的介绍以及一些常见效果的具体代码示例:

基本介绍

SpannableStringCharSequence 的一个子类,用于在一个字符串上应用一种或多种样式。常见的样式可以通过 What 类实现,如:

  • ForegroundColorSpan:设置文本颜色
  • BackgroundColorSpan:设置文本背景颜色
  • StyleSpan:设置文本风格,如粗体,斜体
  • UnderlineSpan:设置文本下划线
  • StrikethroughSpan:设置文本删除线
  • ClickableSpan:设置文本可点击
  • RelativeSizeSpan:设置文本相对大小
基本使用示例
// 创建一个 SpannableString 对象
val spannableString = SpannableString("Hello, Android Developers!")

// 设置文本 'Hello' 为红色
spannableString.setSpan(
    ForegroundColorSpan(Color.RED),
    0, // 开始索引
    5, // 结束索引
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)

// 设置文本 'Android Developers' 为粗体
spannableString.setSpan(
    StyleSpan(Typeface.BOLD),
    7,
    25,
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)

// 给文本 'Developers' 添加下划线
spannableString.setSpan(
    UnderlineSpan(),
    15,
    25,
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
应用文字大小
// 创建一个 SpannableString 对象
val spannableStringSize = SpannableString("Big and small text")

// 'Big' 字段相对比例放大1.5倍
spannableStringSize.setSpan(
    RelativeSizeSpan(1.5f),
    0, 
    3,
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)

// 'small' 字段相对比例缩小至0.7倍
spannableStringSize.setSpan(
    RelativeSizeSpan(0.7f),
    8, 
    13,
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
设置可点击事件
val spannableStringClickable = SpannableString("Click here to learn more!")

val clickableSpan = object : ClickableSpan() {
    override fun onClick(widget: View) {
        // 在这里处理点击事件
        Toast.makeText(widget.context, "Clicked!", Toast.LENGTH_SHORT).show()
    }

    override fun updateDrawState(ds: TextPaint) {
        super.updateDrawState(ds)
        ds.isUnderlineText = true // 设置下划线
    }
}

// 设置 'Click here' 可点击
spannableStringClickable.setSpan(
    clickableSpan,
    0, 
    10,
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)

// textView 需要设置movementMethod
val textView = findViewById<TextView>(R.id.textview)
textView.text = spannableStringClickable
textView.movementMethod = LinkMovementMethod.getInstance()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
综合示例
val comprehensiveSpannable = SpannableString("Red Bold And Click Me")

// 设置红色文字
comprehensiveSpannable.setSpan(
    ForegroundColorSpan(Color.RED),
    0, 
    3,
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)

// 设置粗体文字
comprehensiveSpannable.setSpan(
    StyleSpan(Typeface.BOLD),
    4,
    8,
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)

// 设置可点击文字
val clickableSpanComprehensive = object : ClickableSpan() {
    override fun onClick(widget: View) {
        // 处理点击事件
        Toast.makeText(widget.context, "Text Clicked!", Toast.LENGTH_SHORT).show()
    }

    override fun updateDrawState(ds: TextPaint) {
        super.updateDrawState(ds)
        ds.isUnderlineText = true // 设置下划线
    }
}

comprehensiveSpannable.setSpan(
    clickableSpanComprehensive,
    13, 
    21,
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)

val comprehensiveTextView = findViewById<TextView>(R.id.comprehensive_textview)
comprehensiveTextView.text = comprehensiveSpannable
comprehensiveTextView.movementMethod = LinkMovementMethod.getInstance()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
总结

使用 SpannableString,我们可以在单个字符串内灵活应用多种样式和效果。以上示例展示了如何设置文本颜色,字体样式,添加下划线,设置文字大小和添加点击事件。通过组合这些效果,你可以实现丰富的文本展示和交互效果。


欢迎关注我的公众号AntDream查看更多精彩文章!