我有一个RelativeLayout
,这个布局中有近10个视图。
我已将OnTouchListener
设置为此布局,并在其中执行一些工作并返回true
。
当我触摸没有View的布局(空区域的意思)时,这个监听器工作正常。如果我触摸此布局的子视图,则此侦听器不会触发...
从文档中我了解到我们可以通过扩展ViewGroup来覆盖onInterceptTouchEvent()
(所以这里是RelativeLayout)并在子视图消耗此事件之前处理触摸事件......
这会有一个技巧,但我需要通过将RelativeLayout替换为CustomRelativeLayout来修改我需要此功能的许多xml文件。
所以我的问题是:
在RelativeLayout
中的子视图消费事件之前,有没有办法处理RelativeLayout
(ofcourse ViewGroup)的触摸事件?我不想延长RelativeLayout
...
答案 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"