kotlin textview 下划线超链接

39 阅读1分钟

val textView: TextView = findViewById(R.id.my_text_view)
val fullText = "【置顶】这是一条可以点击的消息"

val spannable = SpannableString(fullText)

val start = 0
val end = 3  // 【置顶】

spannable.setSpan(
    object : ClickableSpan() {
        override fun onClick(widget: View) {
            Toast.makeText(widget.context, "你点击了【置顶】", Toast.LENGTH_SHORT).show()
        }

        override fun updateDrawState(ds: TextPaint) {
            super.updateDrawState(ds)
            ds.isUnderlineText = true      // 下划线
            ds.color = Color.BLUE          // 文字颜色
        }
    },
    start, end,
    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)

textView.text = spannable
textView.movementMethod = LinkMovementMethod.getInstance()  // 必须加!
val textView: TextView = findViewById(R.id.my_text_view)

// ✅ 完整文本内容
val fullText = "这是一段普通文本,置顶这四个字可以点击,其他文字不变。"

// ✅ 要高亮点击的 4 个字
val clickableText = "置顶"  // 你也可以换成 "编辑"、"更多" 等任意四个字

// ✅ 找到这 4 个字在完整文本中的起始位置
val startIndex = fullText.indexOf(clickableText)
val endIndex = startIndex + clickableText.length  // 不包含 endIndex

// ✅ 创建 SpannableString
val spannableString = SpannableString(fullText)

// ✅ 判断是否找到了要点击的文字
if (startIndex != -1 && endIndex <= fullText.length) {
    spannableString.setSpan(
        object : ClickableSpan() {
            override fun onClick(widget: View) {
                // 点击 “置顶” 后的操作
                Toast.makeText(widget.context, "你点击了:$clickableText", Toast.LENGTH_SHORT).show()
            }

            override fun updateDrawState(ds: TextPaint) {
                super.updateDrawState(ds)
                ds.isUnderlineText = true      // 加下划线
                ds.color = Color.BLUE          // 可选:设置文字颜色,比如蓝色
            }
        },
        startIndex, endIndex,  // 仅对 “置顶” 这 4 个字生效
        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
    )
}

// ✅ 设置给 TextView
textView.text = spannableString

// ⭐⭐⭐ 必须设置这个,否则 ClickableSpan 点击无效!
textView.movementMethod = LinkMovementMethod.getInstance()