如何处理在子视图中单击,并在父ViewGroups中触摸?

时间:2015-01-27 20:51:45

标签: android ontouchlistener viewgroup

在我的布局中,我有一个类似的结构:

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

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

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

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

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

3 个答案:

答案 0 :(得分:7)

您需要覆盖每个孩子的onInterceptTouchEvent(),否则父母将保持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;
}

您需要返回false以让子处理它,否则您将其返回给父级。

答案 1 :(得分:1)

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

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

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

不是处理这些事件,而是尝试使用onClick方法。

答案 2 :(得分:0)

我能够使用以下代码解决此问题:

步骤1:在onCreate()方法上方声明EditText

public EditText etMyEdit;

第2步:在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;
        }
    });

希望它对某人有帮助!