需求是这样的:
封装了一个View,类似这样:
image.png
1处的view是添加进来的,需要在点了1里面的某个view之后,把整个view隐藏掉。
因为1处的view是添加进来的,它里面的子view的点击事件都写在它的类里面的,外部不知道有没有被点击,也就没法隐藏整个view。
思路:利用view的OnTouchListener配合GestureDetector来通知是否被点击了
如果这个view是ViewGroup,遍历所有的子view,判断子view和自身是否有点击事件和是否显示
private void setGesture(ViewGroup viewGroup){
if(viewGroup.hasOnClickListeners() && viewGroup.getVisibility() == VISIBLE){
viewGroup.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return detector.onTouchEvent(event);//一定要返回false,否则会拦截onClick事件
}
});
}
for(int i = 0;i
View view = viewGroup.getChildAt(i);
if(view instanceof ViewGroup){
setGesture((ViewGroup) view);
continue;
}
if(view.hasOnClickListeners() && view.getVisibility() == VISIBLE){
view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return detector.onTouchEvent(event); //一定要返回false,否则会拦截onClick事件
}
});
}
}
}
如果是view就跳过遍历子view这一步
配合GestureDetector:
detector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener(){
@Override
public boolean onSingleTapConfirmed(MotionEvent e) { //单击
if(onViewClick!= null){
onViewClick.onClick(null);
}
return super.onSingleTapConfirmed(e);
}
});