android 事件分发机制是从Activity-ViewGroup-View,层层分发的,通过activtiy的dispatchTouchEvent方法分发到ViewGroup的dispatchTouchEvent,ViewGroup通过调用onInterceptTouchEvent方法来判断是否拦截事件,如果不拦截就继续分发到View中,然后遍历ViewGrop中所有子View找到我们点击的View控件,将事件传递到该View的dispatchTouchEvent中。然后View会调用自身的onTouch方法,我们可以重写onTouch方法,进行拦截,点击事件。
具体分发机制可以看这边博客:
Android事件分发机制详解:史上最全面、最易懂
当我们了解了事件分发机制后,如果现在又这样的一个需求,比如网络请求的时候,要禁止所有按钮的点击事件,比较笨的方法是,单独关闭按钮的点击事件。当我们了解了分发机制后,可以直接重写Activity 的dispatchTouchEvent方法,返回一个true,即可拦截所有的触摸时间,这样整个页面的按钮都不能被点击,(触摸优先级高于点击的优先级,点击事件只是触摸的一种特殊方式。),可以在activity基类重写
dispatchTouchEvent方法,然后设置一个变量来控制是否禁用全局点击事件,具体代码:
private var disableAllClick: Boolean = false
//禁用所有触摸事件
fun setDisableAllClick(disableAllClick: Boolean): BaseActivity {
this.disableAllClick = disableAllClick
return this
}
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
return if (!disableAllClick) {
super.dispatchTouchEvent(ev)
} else {
disableAllClick
}
}
这样就可以直接在子类activity中调用setDisableAllClick(true)来禁用点击全局点击事件了。