利用 SpannableString 改变个别字体颜色,个别字体点击事件

需求说明,一段字符串点击,个别字,具有点击事件且变色,如下所示:

val a1 = "#我爱我家"
val a2 = "#你爱我家"
val a3 = "#我爱你家"
val a1Span = SpannableString(a1)
val a2Span = SpannableString(a2)
val a3Span = SpannableString(a3)
val a1ClickableSpan = TestClickableSpan(a1, this)
val a2ClickableSpan = TestClickableSpan(a2, this)
val a3ClickableSpan = TestClickableSpan(a3, this)
a1Span.setSpan(a1ClickableSpan, 0, a1.length, Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
a2Span.setSpan(a2ClickableSpan, 0, a2.length, Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
a3Span.setSpan(a3ClickableSpan, 0, a3.length, Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
textView.text = "哈话哈"
textView.append(a1Span)
textView.append("jasfjsdfsa;jfd;skdfl")
textView.append(a2Span)
textView.append(a3Span)
textView.movementMethod = LinkMovementMethod.getInstance()
class TestClickableSpan(val str: String, val mContext: Context) : ClickableSpan() {

    override fun updateDrawState(ds: TextPaint) {
        ds.color = Color.BLUE
    }

    override fun onClick(widget: View) {
        Toast.makeText(mContext, str, Toast.LENGTH_SHORT).show()
    }
}

**问题:**那如何点击完个别字,取消 textview 本身的点击事件呢??

  1. 点击ClickableSpan不触发textview的点击事件
  2. 点击textview,不触发ClickableSpan(这个一般不会有)
// 只要在textview的点击事件加多一个判断即可解决点击ClickableSpan会触发textview的点击事件
// 简单明了,网上看了很多教程,都是重写textview,搞得麻烦,搞半天还没用
tv.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ClassroomLog.log(TAG, "Textview Click listener ");
        if (tv.getSelectionStart() == -1 && tv.getSelectionEnd() == -1) {
            
        }
    }
});

利用正则匹配显示字段:


val mRegular = "#[\u4e00-\u9fa5\\w]+#"
val pattern = Pattern.compile(mRegular)
val spannableString = SpannableString("#sdjhs# #asdfsdf #+sdhfskd+@@\$\$##sdfsd#")
val matcher = pattern.matcher(spannableString)
if (matcher.find()) {
    matcher.reset()
}

while (matcher.find()) {
    val topic = matcher.group(0)

    // 处理话题##符号
    if (topic != null) {
        val start = matcher.start(0)
        val end = start + topic.length
        val foregroundColorSpan = ForegroundColorSpan(Color.BLUE)
        val testClickSpan = TestClickSpan(topic, this)
        spannableString.setSpan(
            testClickSpan,
            start,
            end,
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
        )
    }
}

// 要实现文字的点击效果,这里需要做特殊处理
textView.movementMethod = LinkMovementMethod.getInstance()
textView.text = spannableString
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值