如何处理子视图中的点击,以及父视图组中的触摸?

How to handle click in the child Views, and touch in the parent ViewGroups?

在我的布局中,我有这样的结构:

--RelativeLayout
  |
  --FrameLayout
    |
    --Button, EditText...

我想在RelativeLayout和FrameLayout中处理触摸事件,所以我在这两个视图组中设置了onTouchListener。但仅捕获 RelativeLayout 中的触摸。

为了尝试解决这个问题,我编写了自己的 CustomRelativeLayout,并覆盖了 onInterceptTouchEvent,现在捕获了子 ViewGroup (FrameLayout) 中的点击,但按钮和其他视图中的点击没有发挥任何作用。

在我自己的自定义布局中,我有这个:

public boolean onInterceptTouchEvent(MotionEvent ev) {
    return true;
}

您的自定义解决方案将从您的相关布局中的任何位置捕获触摸事件,因为覆盖的方法设置为始终抛出 true。

根据您的要求,我想它更好用 onClick 方法而不是使用 onTouch。

OnTouch 方法在每个 TouchEvent 上调用不同的线程,我猜这就是你的问题的原因

与其处理这些事件,不如试试 onClick 方法。

您需要覆盖每个 child 的 onInterceptTouchEvent(),否则它仍将是 parent 的 onTouchEvent

Intercept Touch Events in a ViewGroup

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    /*
    * This method JUST determines whether we want to intercept the motion.
    * If we return true, onTouchEvent will be called and we do the actual
    * scrolling there.
    */
...
    // In general, we don't want to intercept touch events. They should be 
    // handled by the child view.
    return false;
}

您需要 return false 才能让 child 处理它,否则您会 return 将其发送给 parent。

我用下面的代码解决了这个问题:

第一步:在onCreate()方法上面声明EditText

public EditText etMyEdit;

第二步:在onResume()方法中配置结束:

etMyEdit = (EditText) findViewById (R.id.editText);

etMyEdit.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            v.getParent().requestDisallowInterceptTouchEvent(true);
            switch (event.getAction() & MotionEvent.ACTION_MASK){
                case MotionEvent.ACTION_UP:
                    v.getParent().requestDisallowInterceptTouchEvent(false);
                    return false;
            }
            return false;
        }
    });

希望对大家有所帮助!