[英]android passing events from child view to parent
我有兩個自定義視圖Child(相對布局)和Parent(FrameLayout)。 當一次點擊發生時,我想讓孩子處理事件但是仍然將其進一步傳遞給Parent,而對於Child中的任何其他事件,只需將其進一步傳遞而不進行處理。
子視圖設置為match_parent。
這是我到目前為止:
public class Child extends RelativeLayout implements View.OnTouchListener {
private class GestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
// process the event
return true;
}
}
public boolean onTouch(View view, MotionEvent motionEvent) {
return true;
}
@Override
public boolean dispatchTouchEvent(MotionEvent e) {
gestrDetect_.onTouchEvent(e);
return super.dispatchTouchEvent(e);
}
}
public class Parent extends FrameLayout {
public Parent(Context context, AttributeSet attrs) {
super(context, attrs);
setOnTouchListener(this);
}
@Override
public boolean onTouch(View view, MotionEvent event) {
return gestrDetect_.onTouchEvent(event);
}
}
當我在子視圖中獲得單個點擊事件時,所有其他事件(如fling或scale)都不會傳遞給父級。 處理子節點中某個事件子集的正確方法是什么,同時仍將其中一些事件傳遞給父節點?
我已將代碼更改為以下內容:
public class Child extends RelativeLayout implements View.OnTouchListener {
private class GestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onFling(android.view.MotionEvent e1, android.view.MotionEvent e2, float velocityX, float velocityY) {
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
// process the event
return true;
}
}
public boolean onTouch(View view, MotionEvent motionEvent) {
return gestrDetect_.onTouchEvent(e);
}
@Override
public boolean dispatchTouchEvent(MotionEvent e) {
return super.dispatchTouchEvent(e);
}
}
public class Parent extends FrameLayout {
@Override
public boolean onTouch(View view, MotionEvent event) {
return gestrDetect_.onTouchEvent(event);
}
}
事件仍然沒有傳遞給父母。 當我改變
@Override
public boolean onDown(MotionEvent e) {
return true;
}
至
return false;
我甚至沒有得到孩子的singleTapUp事件。
您需要創建自己的父ViewGroup實現並覆蓋onInterceptTouchEvent()方法(請參閱本教程http://developer.android.com/training/gestures/viewgroup.html )。
有了這個你可以確定方法應該由父處理,哪些將傳遞給子。
這對我有用。
/**
* If set to true the layout will discard all received {@link MotionEvent}'s .
* As a result none of the children will receive the touch event, instead the parent view will.
*/
public void setPassTouchEventsUp(final boolean passTouchEventsUp) {
mPassTouchEventsUp = passTouchEventsUp;
}
@Override
public boolean onInterceptTouchEvent(final MotionEvent ev) {
if (mPassTouchEventsUp) {
return true;
} else {
return super.onInterceptTouchEvent(ev);
}
}
@Override
public boolean onTouchEvent(final MotionEvent event) {
if (mPassTouchEventsUp) {
return false;
} else {
return super.onTouchEvent(event);
}
}
當我調用setPassTouchEventsUp(true)
,ViewGroup將不會處理任何MotionEvent
,通知其父視圖必須由高級視圖/布局處理事件。 通過這種方式,事件可以“飛過”此ViewGroup直到其父級或其下方的任何內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.