安卓:如何将子视图的事件传递给父视图

3

我有两个自定义视图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);
  }      
}

虽然我能够在子视图中获取单击事件,但其他事件(如快速滑动或缩放)都无法传递到父级。在保留某些事件传递给父级的情况下,应该如何处理子视图中的某一特定事件子集?

编辑

我已将代码更改为以下内容:

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事件。

2个回答

3

2

对我有用的东西。

/**
 * 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,传递到其父视图或位于其下方的任何其他视图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接