解决 ClickableSpan 点击后背景色不恢复的问题

1,186 阅读1分钟
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 事件时进行手动复位