[Android]父View如何知道子View被点击了

需求是这样的:
封装了一个View,类似这样:

image.png

1处的view是添加进来的,需要在点了1里面的某个view之后,把整个view隐藏掉。
因为1处的view是添加进来的,它里面的子view的点击事件都写在它的类里面的,外部不知道有没有被点击,也就没法隐藏整个view

思路:利用viewOnTouchListener配合GestureDetector来通知是否被点击了
  • 如果这个viewViewGroup,遍历所有的子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<viewGroup.getChildCount();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);
            }
        });

推荐阅读更多精彩内容