TextView设置部分文字字体颜色和点击事件

文章介绍了如何在Android开发中,利用SpannableString和ClickableSpan接口创建一行文字中部分字体具有点击事件的效果,以实现用户同意隐私协议的交互。通过设置不同的Span类型和flags,可以控制文本的样式和行为。同时,通过覆盖ClickableSpan的onClick和updateDrawState方法,自定义点击事件和去除默认下划线。最后,通过LinkMovementMethod使文本变得可点击。

在工作时,总会被要求写关于同意隐私协议的页面(类似于勾选选择框后,同意相关《隐私协议》),这里的隐私协议通常设有点击事件供用户看到详细的协议细则,那么就会出现一行文字有不同字体以及部分字体有点击事件的情况。最容易想到的是一行使用多个TextView来实现,但这个方法过于繁琐,或者说是比较笨的办法。通过查阅资料,了解到有SpannableString类和ClickableSpan接口来实现。

SpannableString意为可跨度字符串,能更简便的设置文字字样,主要用到setSpan()方法。

其中,四个参数分别有以下含义:

what:各种Span,比如字体大小、字体颜色等

start:所要修改字符下标开始位置,修改包含start这个位置(从0开始)

end:所要修改字符下标结束位置,修改不包含start这个位置

flags:一般有四个常用模式

  • Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式

  • Spannable.SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式

  • Spannable.SPAN_INCLUSIVE_EXCLUSIVE:前面包括,后面不包括

  • Spannable.SPAN_INCLUSIVE_INCLUSIVE:前后都包括

文本实现效果的区域选择好了,接下来就是通过ClickableSpan接口实现对文本字体颜色和点击事件了。ClickableSpan接口中定义了两个方法。能看到这里,实现updateDrawState方法默认自带下划线。

具体使用:

 spannableString = SpannableString("需要设置的字符串")
        spannableString.setSpan(object:ClickableSpan(){
            override fun onClick(widget: View) {
                Toast.makeText(this@MainActivity,"点击了",Toast.LENGTH_LONG).show()
            }
            override fun updateDrawState(ds: TextPaint) {
                super.updateDrawState(ds)
                ds.color = Color.parseColor("#2E6BE5")
                //取消默认的下划线
                ds.isUnderlineText = false
            }
        },4,10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        //然后把spannableString放进到Text中
        binding.tvPrivacyTip.setText(spannableString)
        //中途遇到点击后字体显示高亮,取消高亮
        binding.tvPrivacyTip.setHighlightColor(Color.parseColor("#00000000")
        //最后设置可点击,必须实现,否则只能显示样式,无法实现点击效果
        binding.tvPrivacyTip.setMovementMethod(LinkMovementMethod.getInstance())

显示高亮效果:

取消高亮效果:

总之,setSpan的第一个参数还有很多种玩法,看到过有添加高亮等等,暂时找不到相关网址了,等以后找到了再进行补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值