簡體   English   中英

android將事件從子視圖傳遞到父視圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM