使主要内容区域在DrawerLayout中处于活动状态

时间:2013-09-11 13:51:56

标签: android navigation-drawer drawerlayout

如何在抽屉打开时制作活动的主要内容区域。目前,如果点击主要内容区域,抽屉将被关闭,然后触摸事件将被删除,我想抓住该触摸事件并将其传递到主要内容区域。

2 个答案:

答案 0 :(得分:5)

您需要创建自定义DrawerLayout和@overide onInterceptTouchEvent。然后,您可以创建一些注册抽屉视图的方法(如setDrawerViewWithoutIntercepting),这些方法可以在打开时使用(单击)主要内容。您应该在您的activity / fragment中调用此方法,使用此DrawerLayout。

OnInterceptTouchEvent将返回false,以防打开已注册的抽屉视图并且触摸位于抽屉视图区域之外。这意味着所有功能保持不变(例如使用滑动关闭抽屉视图等)

这只是应该改进的例子,所以我希望它会对你有帮助。

private View currentDrawerView;

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    boolean result = super.onInterceptTouchEvent(event);

    if (currentDrawerView != null && isDrawerOpen(currentDrawerView)) {
        DrawerLayout.LayoutParams layoutParams = (DrawerLayout.LayoutParams) currentDrawerView.getLayoutParams();

        if (layoutParams.gravity == Gravity.RIGHT) {
            if (event.getX() < currentDrawerView.getX()) {
                result = false;
            }
        }
        else if (layoutParams.gravity == Gravity.LEFT) {
            if (event.getX() > currentDrawerView.getX() + currentDrawerView.getWidth()) {
                result = false;
            }
        }
        // ......

    };
    return result;
}

public void setDrawerViewWithoutIntercepting(View view) {
    this.currentDrawerView = view;
}

答案 1 :(得分:4)

我用临时解决方案解决了我的问题,不是那么优雅,但是这项工作有一段时间,可能包含副作用。我总是在onInterceptTouchEvent()调用中返回false,并且每次都是活动的。

public class CustomDrawerLayout extends DrawerLayout {

    public CustomDrawerLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public CustomDrawerLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomDrawerLayout(Context context) {
        super(context);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        // always false and event will be send to each view
        return false;
    }   
}