Android

Activity禁用全局点击事件

2019-09-18  本文已影响0人  儿歌八万首

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)来禁用点击全局点击事件了。

上一篇下一篇

猜你喜欢

热点阅读