object ClickLinkMovementMethod : LinkMovementMethod() {
override fun onTouchEvent(
widget: TextView,
buffer: Spannable,
event: MotionEvent
): Boolean {
return super.onTouchEvent(widget, buffer, event).apply {
if (event.action == MotionEvent.ACTION_UP) {
// clear background color
Selection.removeSelection(buffer)
}
}
}
}
fun Spannable.clickable(start: Int, end: Int, action: () -> Unit) {
setSpan(object : ClickableSpan() {
override fun onClick(widget: View) {
action()
}
}, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
}
ClickableSpan 产生这个问题这个问题的原因是,其点击回调是由 LinkMovementMethod 负责,而在 LinkMovementMethod 中,有可点击段落被匹配到时,ACTION_UP 事件后未进行复位
所以给出解决方案为,继承 LinkMovementMethod 覆写 onTouchEvent 方法,当 ACTION_UP 事件时进行手动复位