Andorid父布局拦截子布局点击事件

今天遇到个需求,当用户登录成功之后,需要判断用户是否已经通过认证的用户,如果是认证通过,APP中功能正常使用,否则无论点击首页哪块地方,弹出提示框用户账号正在等待认证,开始的想法在之前首页所有的点击事件之前加上判断,这样做是可行的,但是有两点不太好,第一点:不符合需求,需求要求的是首页所有的地方,包括空白处,我只能控制有点击事件的地方;第二点:APP首页按钮很多,加的地方有点多。所以又想了一个办法,Android父布局拦截子布局,因为我首页的xml父布局是LinearLayout,所以这里我打算自定义LinearLayout,来实现父布局拦截子布局点击事件,是否拦截通过判断用户账号是否认证传入到自定义的LinearLayout中,下面贴出我的自定义LinearLayout代码。

public class CustomLinearLayout extends LinearLayout {public boolean mIsIntercept = false; //是否拦截子项点击事件 默认不拦截public CustomLinearLayout(Context context) { super(context); }public CustomLinearLayout(Context context, @Nullable AttributeSet attrs) { super(context, attrs); }public CustomLinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); }@Override public boolean onInterceptTouchEvent(MotionEvent ev) {return mIsIntercept; //true就是拦截false就是不拦截,拦截的意思是事件不会继续往下分发,如果当前View,处理这个点击事件,则事件到此终止,如果不处理这次事件,则事件会继续往上传递,不会往下分发了 }public boolean ismIsIntercept() { return mIsIntercept; }public void setmIsIntercept(boolean mIsIntercept) { this.mIsIntercept = mIsIntercept; //这个是提供的一个外部的一个入口,来判断父布局是否拦截当前的事件 } }

上面是一个自定义的LinearLayout,通过onInterceptTouchEvent方法来控制当前的View是否拦截点击事件,返回为true表示拦截,当然我们还需要要通过引用这个布局的Activity传入数据来判断是否拦截,写法如下:
CustomLinearLayout tvFather = findViewById(R.id.tv_father); //这个可能需要条件判断,我这里直接传了true表示拦截此时如果子布局和父布局同时设置点击事件,父布局会起作用,事件已经传不到子布局了 tvFather.setmIsIntercept(true);

【Andorid父布局拦截子布局点击事件】当一个点击事件到达了某个View的时候,会走三个方法,这三个方法分别为:
dispatchTouchEvent():是用来分发事件的,只要事件能够传递给当前View,这个方法一定调用
onInterceptTouchEvent():表示是否用来当前拦截事件用的
onTouchEvent():是用来处理当前事件的
时间仓促,有不对的地方及时指正,随时更改。

    推荐阅读