Android 中 View.setEnabled(false) 无效的解决方法

3429 查看

今天遇到了一个很诡异的问题,Android 的 setEnable(false) 没有作用,网上找的很多方法还是没用。会出现这种情况的有下面几个场景:

  1. ListView中的子视图setEnable(false)后点击仍然会相应onItemClick
  2. FrameLayout中上层试图disable后,的确没有响应事件,但是touch事件传递到下层视图了
  3. ViewGroup调用setEnable(false),不会自动把子视图设为disabled

针对第一个场景,同事给出了一个解决方法:设置一个空的onClickListener

其实上面的做法就是消费点击事件但是什么都不做,并不是一般情况下的不消费点击事件。在Android的View源码中我找到了产生这个效果的原因,具体看下面代码:

 场景分析

现在再来分析开始提到的三个场景:

  1. ListView的子试图为disabled后不消费touch事件,接下来传到ListView后调用onItemClick方法,所以子视图自己消费touch事件,就不会传递下去了。
  2. FrameLayout中的上层视图disabled后,传递到下面的视图跟场景1是一样的,都可以通过前面提过的解决方法解决,不过setOnClickListener可以用setClickable替代。

3. ViewGroup设为disabled之后,子视图仍然可以正常点击,这个问题网上很多人都说用遍历子视图逐个setEnable(false)的方法,不过都是用递归算法实现的,下面我给出循环的实现方式:

这篇文章就到这里,有什么问题欢迎大家与我沟通交流。