处理拦截触摸事件而不扩展ViewGroup

时间:2014-01-09 07:20:38

标签: android ontouchevent ontouchlistener

我有一个RelativeLayout,这个布局中有近10个视图。

我已将OnTouchListener设置为此布局,并在其中执行一些工作并返回true

当我触摸没有View的布局(空区域的意思)时,这个监听器工作正常。如果我触摸此布局的子视图,则此侦听器不会触发...

从文档中我了解到我们可以通过扩展ViewGroup来覆盖onInterceptTouchEvent()(所以这里是RelativeLayout)并在子视图消耗此事件之前处理触摸事件......

这会有一个技巧,但我需要通过将RelativeLayout替换为CustomRelativeLayout来修改我需要此功能的许多xml文件。

所以我的问题是:

RelativeLayout中的子视图消费事件之前,有没有办法处理RelativeLayout(ofcourse ViewGroup)的触摸事件?我不想延长RelativeLayout ...

5 个答案:

答案 0 :(得分:21)

尝试覆盖

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    return super.dispatchTouchEvent(ev);
}
Activity

。 此方法是第一个处理触摸事件的方法。 但在这种情况下,您需要使用当前的视图坐标

答案 1 :(得分:1)

在处理onTouchEvent()事件时,尝试在子视图的ACTION_DOWN方法中返回false。因此,转发触摸事件将不会发送到子视图,即未消耗的事件。

答案 2 :(得分:1)

虽然不一定是理想的,但这适用于不具备动态内容的小型布局。

在xml中,将android:clickable="false"设置为布局中ViewGroup的所有后代(包括嵌套的ViewGroups及其子项)。每个被点击的孩子都会将点击传播到其父级,最终转到ViewGroup的默认触摸处理程序。确保设置根ViewGroup,您希望将点击事件设为android:clickable="true"viewgroup.setClickable(true)

如果您动态添加视图,请务必在将视图添加到视图层次结构之前调用view.setClickable(false);

答案 3 :(得分:0)

尝试将onTouchListener添加到RelativeLayout

RelativeLayout rl = (RelativeLayout) findViewById( R.id.relativeLauout );
    rl.setOnTouchListener( new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // do something
            return false;
        }
    });

或使用Activity中的onTouchEvent方法

@Override
public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    return super.onTouchEvent(event);
}

答案 4 :(得分:-2)

您只需在xml中设置:

android:clickable="true"