如何处理子视图中的点击,以及父视图组中的触摸?
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;
}
});
希望对大家有所帮助!
在我的布局中,我有这样的结构:
--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;
}
});
希望对大家有所帮助!