引入
项目中遇到这样一个需求,TextView中的部分文字实现可以点击跳转的逻辑,大概是这样:
通过查找谷歌官方文档发现有已经封装好的类库可以实现这种功能了
SpannableStringBuilder
官方注释:This is the class for text whose content and markup can both be changed.
翻译为:这是内容和标记都可以更改的文本类。
实现
/**
* 根据接口数据动态设置协议
*/
private fun initProtocol(list: List<RegisterProtocol>) {
if(!list.isNullOrEmpty()){
var nameList= ArrayList<String>()
for (registerProtocol in list)
nameList.add(registerProtocol.name!!)
var joinStr=TextUtils.join("、",nameList)
var result=String.format("我已阅读并同意%s",joinStr)
var style = SpannableStringBuilder();
style.append(result);
var startIndex=7
for(index in 0..list.size-1){
var registerProtocol=list.get(index)
var name=registerProtocol.name
var url=registerProtocol.url
//设置协议点击事件
val clickableSpan = object : ClickableSpan() {
override fun onClick(widget: View) {
ARouter.getInstance().build(RouterUrl.Web.H5).withString("url", url).navigation()
}
override fun updateDrawState(ds:TextPaint) {
//super.updateDrawState(ds)
ds.setUnderlineText(false) //是否设置下划线 false不设置
}
}
var endIndex=startIndex+name!!.length
style.setSpan(clickableSpan, startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
//设置协议文字颜色
var foregroundColorSpan = ForegroundColorSpan(ContextCompat.getColor(context, R.color.c_ff722c))
style.setSpan(foregroundColorSpan, startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
startIndex=endIndex+1 //顿号、 所以要+1
}
//在单击链接时凡是有要执行的动作,都必须设置MovementMethod对象
register_protocol.setMovementMethod(LinkMovementMethod.getInstance())
register_protocol.setText(style)
}
}
实现就这么简单,具体可以根据你们的实际需求去修改。