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);

当一个点击事件到达了某个View的时候,会走三个方法,这三个方法分别为:
dispatchTouchEvent():是用来分发事件的,只要事件能够传递给当前View,这个方法一定调用
onInterceptTouchEvent():表示是否用来当前拦截事件用的
onTouchEvent():是用来处理当前事件的

时间仓促,有不对的地方及时指正,随时更改。

你可能感兴趣的:(Android随笔)