TextView设置textIsSelectable后点击事件异常问题

问题描述

在使用TextView时候配置了android:textIsSelectable="true",同时也设置了点击事件。发现点第一次时候,点击事件没有生效,第二次点击才会触发。如果不点击其他View,后续点击事件都会触发。而点击其他View后再点击这个TextView,又会出现同样的问题。

搜到的解决方法

搜了一下还是有很多人遇到过这个问题,大部分的解决思路是重写onTouchEvent,检测到不是长按就设置textIsSelectablefalse,事件结束再设置回原来的。

亲测了一下有一定效果,但是发现测试的手机会出现单击进入选中状态,但是选中的文字没有光标可以滑动选择。且整体的表现有点诡异,还会导致放大镜功能工作异常。体验感还是挺不好的。

我的解决方法

总结了一下,发现问题点是出现在焦点上。解决问题只要在onTouchEvent调用下requestFocus()即可。由于使用的场景不多,不确保这种该法有没有其他兼容性问题。

其他问题

既然双击可以触发选择文本,但是此时我是不希望TextView被点击的,所以最终版本如下,使用GestureDetector判断单击再执行点击事件。有一个问题点,onSingleTapConfirmed执行需要确认没有出现双击,所以触发没有点击事件那么快。

@SuppressLint("ClickableViewAccessibility")
class MyTextView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : AppCompatTextView(context, attrs, defStyleAttr) {

    private var onSingleTapListener:OnClickListener? = null

    private val gestureDetector = GestureDetector(context, object :
        GestureDetector.SimpleOnGestureListener() {
            override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
                onSingleTapListener?.onClick(this@MyTextView)
                return true
            }
        }
    )

    init {
        setOnTouchListener { _, event -> gestureDetector.onTouchEvent(event) }
    }

    override fun onTouchEvent(event: MotionEvent): Boolean {
        when (event.action) {
            MotionEvent.ACTION_UP -> {
                requestFocus()
            }
        }
        return super.onTouchEvent(event)
    }

    fun setOnSingleTapListener(l: OnClickListener?) {
        if (!isClickable) {
            isClickable = true
        }
        onSingleTapListener = l
    }
}
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值