/**
* 配置Span标签
*/
fun TextView.setSpanText(
string: Int, //字符串内容
strList: Array<String>, //需要变色的字符串数组
line: Boolean = false,//是否添加下划线
colorSet: Int= R.color.main_color,//需要设置的颜色值
action: (index: Int) -> Unit = {}, //点击回调
) {
if (strList.isEmpty()) return
val text = getStringExt(string)
val spannableString = SpannableString(text)
var updateIndex = 0
var lastLength = 0 //拿最后一条起始的位置
strList.forEachIndexed { index, spanStr ->
var agreementStart = text.indexOf(spanStr)
if(agreementStart ==-1){
agreementStart = 0
}
val agreementEnd = agreementStart + spanStr.length
//点击用户协议
spannableString.setSpan(
object : ClickableSpan() {
override fun updateDrawState(ds: TextPaint) {
// Do nothing, effectively removing the underline
ds.bgColor = Color.TRANSPARENT
}
override fun onClick(view: View) {
action.invoke(agreementType(strList, spanStr))
}
},
agreementStart,
agreementEnd,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
//点击前面的数据
if (agreementStart > 0 && agreementStart >= updateIndex) {
spannableString.setSpan(
object : ClickableSpan() {
override fun updateDrawState(ds: TextPaint) {
// Do nothing, effectively removing the underline
ds.bgColor = Color.TRANSPARENT
}
override fun onClick(view: View) {
action.invoke(-1)
}
},
updateIndex,
agreementStart,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
updateIndex = agreementStart - 1
if (index == strList.size - 1) {
//拿最后一条起始的位置
lastLength = updateIndex + 1
}
}
//可点击后面的数据
if (lastLength > 0) {
spannableString.setSpan(
object : ClickableSpan() {
override fun updateDrawState(ds: TextPaint) {
// Do nothing, effectively removing the underli
ds.bgColor = Color.TRANSPARENT
}
override fun onClick(view: View) {
action.invoke(-1)
}
},
lastLength,
text.length - 1,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
}
//取消下划线显示
if (!line) {
spannableString.setSpan(
NoUnderlineSpan(),
agreementStart,
agreementEnd, Spanned.SPAN_MARK_MARK
)
}
//设置字体颜色
spannableString.setSpan(
ForegroundColorSpan(getColorExt(colorSet)),
agreementStart,
agreementEnd,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
}
this.text = spannableString
this.movementMethod = LinkMovementMethod.getInstance()
//取消选中高亮颜色
this.highlightColor = Color.TRANSPARENT
}
/**
* 如何使用
*/
mBind.mTv.setSpanText(R.string.str_content, strArray,true,R.color.main_color, {
when (it) {
0 -> "用户协议".toast()
1 -> "隐私协议".toast()
else ->"点击其他位置".toast()
}
})
有问题请及时指出,看到后会修改。