在工作时,总会被要求写关于同意隐私协议的页面(类似于勾选选择框后,同意相关《隐私协议》),这里的隐私协议通常设有点击事件供用户看到详细的协议细则,那么就会出现一行文字有不同字体以及部分字体有点击事件的情况。最容易想到的是一行使用多个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的第一个参数还有很多种玩法,看到过有添加高亮等等,暂时找不到相关网址了,等以后找到了再进行补充。
文章介绍了如何在Android开发中,利用SpannableString和ClickableSpan接口创建一行文字中部分字体具有点击事件的效果,以实现用户同意隐私协议的交互。通过设置不同的Span类型和flags,可以控制文本的样式和行为。同时,通过覆盖ClickableSpan的onClick和updateDrawState方法,自定义点击事件和去除默认下划线。最后,通过LinkMovementMethod使文本变得可点击。

741

被折叠的 条评论
为什么被折叠?



