开发小知识记录
一段文本分成多段可点击且颜色不一样,实现技巧如下:
kotlin
val text = getString(R.string.cancel_account_protocol)
val spannableString = SpannableString(text)
//设置点击前面的字的响应
val clickableSpan1 = object : ClickableSpan() {
override fun onClick(widget: View) {
//前半部分点击事件
}
override fun updateDrawState(ds: TextPaint) {
ds.color = ContextCompat.getColor(requireActivity(),R.color.color_40black) //1
ds.isUnderlineText = false //2
}
}
spannableString.setSpan(
clickableSpan1,
0,
text.length - 6,
Spannable.SPAN_INCLUSIVE_EXCLUSIVE
)
// 设置点击后面的字的响应
val clickableSpan2 = object : ClickableSpan() {
override fun onClick(widget: View) {
//后半部分点击事件
}
override fun updateDrawState(ds: TextPaint) {
ds.color = ContextCompat.getColor(requireActivity(),R.color.color_07c160)
ds.isUnderlineText = false
}
}
spannableString.setSpan(
clickableSpan2,
text.length - 6,
text.length,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
binding.tvProtocol.movementMethod = LinkMovementMethod.getInstance() //3
binding.tvProtocol.text = spannableString
binding.tvProtocol.highlightColor = ContextCompat.getColor(requireActivity(),android.R.color.transparent) //4
注意点一:
变色不是通过ForegroundColorSpan
实现的,而是注释1
处实现的
注意点二:
去除下划线是重写updateDrawState
方法,将isUnderlineText
设置为false
实现的,见注释2
处。
注意点三:
ClickableSpan
点击会有选中背景的效果,如果想要清除需要设置TextView的highlightColor
为透明色,代码中注释4
处。最后不要忘记在设置spannableString
之前设置LinkMovementMethod.getInstance()
,见注释3
处。