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():是用来处理当前事件的
时间仓促,有不对的地方及时指正,随时更改。
推荐阅读
- 那件我们忽略的小事叫感恩
- 有父母作榜样的家才是真正的学区房
- 老了的父母
- 父母越不讲道理,孩子反而越优秀!说的是你吗()
- 孩子不是实现父母欲望的工具——林哈夫
- 《老婆》
- 我的小叔
- 陷入父母的心理战,孩子被彻底打败
- 焦点父母课堂洛阳中期班|焦点父母课堂洛阳中期班 第125分享 汪丽
- 值得父母深思的犹太家庭教育