问题场景
今天遇到了一个很诡异的问题,Android 中 setEnable(false) 没有作用,网上找的很多方法还是没用。会出现这种情况的有下面几个场景:
- ListView 中的子视图 setEnable(false) 后点击仍然会响应 onItemClick
- FrameLayout 中上层试图 disable 后,上层试图没有响应事件,但是 touch 事件传递到下层视图了
- ViewGroup 调用 setEnable(false),不会自动把子视图设为 disabled
针对第一个场景,同事给出了一个解决方法:设置一个空的 onClickListener
|
|
其实上面的做法就是消费点击事件但是什么都不做,并不是一般情况下的不消费点击事件。在 Android 的 View 源码中我找到了产生这个效果的原因,具体看下面代码:
|
|
场景解析
现在再来分析开始提到的三个场景:
ListView 的子试图为 disabled 后不消费 touch 事件,接下来事件回传给 ListView,传到 ListView 后调用 onItemClick 方法,所以子视图应该消费 touch 事件,可以用上面的方法解决。
FrameLayout 中的上层视图 disabled 后,touch 事件继续传递到下面的视图跟场景 1 是一样的,都可以通过前面提过的解决方法解决,不过 setOnClickListener 可以用 setClickable 替代。
|
|
- ViewGroup 设为 disabled 之后,子视图仍然可以正常点击,这个问题网上很多人都说用遍历子视图逐个 setEnable(false) 的方法,不过都是用递归算法实现的,下面我给出循环的实现方式:
|
|