问题描述
在使用TextView时候配置了android:textIsSelectable="true"
,同时也设置了点击事件。发现点第一次时候,点击事件没有生效,第二次点击才会触发。如果不点击其他View,后续点击事件都会触发。而点击其他View后再点击这个TextView,又会出现同样的问题。
搜到的解决方法
搜了一下还是有很多人遇到过这个问题,大部分的解决思路是重写onTouchEvent
,检测到不是长按就设置textIsSelectable
为false
,事件结束再设置回原来的。
亲测了一下有一定效果,但是发现测试的手机会出现单击进入选中状态,但是选中的文字没有光标可以滑动选择。且整体的表现有点诡异,还会导致放大镜功能工作异常。体验感还是挺不好的。
我的解决方法
总结了一下,发现问题点是出现在焦点上。解决问题只要在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
}
}