如何通过触摸外部抽屉来防止关闭导航抽屉

Ant*_*kov 5 android touch navigation-drawer

我有一个带有导航抽屉的活动。如果用户设备在桌子上并且方向是横向-我不需要通过单击抽屉中的项目来关闭抽屉:

if (!isTablet || context.getResources().getConfiguration().orientation==1) {
    mDrawerLayout.closeDrawer(Gravity.START);
}
Run Code Online (Sandbox Code Playgroud)

这行得通。但是,如果用户在打开的抽屉外面触摸屏幕-抽屉关闭。不适合使用DrawerLayout.LOCK_MODE_LOCKED_OPEN,因为我需要保存抽屉滑动功能。 当用户触摸抽屉外部时,如何防止关闭导航抽屉?

请帮忙。

Nou*_*eep 4

基于我在这里写的其他答案。我已经修改了代码以满足您的问题。请检查。

在此处查看有关触摸层次结构的更多信息

dispatchTouchEvent()方法应该在Activity类中重写

@Override    
public boolean dispatchTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_UP) {
        if (isDrawerOpen()) { //Your code here to check whether drawer is open or not. 

            View content = findViewById(R.id.drawer); //drawer view id
            int[] contentLocation = new int[2];
            content.getLocationOnScreen(contentLocation);
            Rect rect = new Rect(contentLocation[0],
                contentLocation[1],
                contentLocation[0] + content.getWidth(),
                contentLocation[1] + content.getHeight());

            if (!(rect.contains((int) event.getX(), (int) event.getY()))) {
                isOutSideClicked = true;
            } else {
                isOutSideClicked = false;
            }

        } else {
            return super.dispatchTouchEvent(event);
        }
    } else if (event.getAction() == MotionEvent.ACTION_DOWN && isOutSideClicked) {
        isOutSideClicked = false;
        return super.dispatchTouchEvent(event);
    } else if (event.getAction() == MotionEvent.ACTION_MOVE && isOutSideClicked) {
        return super.dispatchTouchEvent(event);
    }

    if (isOutSideClicked) {
        return true; //restrict the touch event here
    }else{
        return super.dispatchTouchEvent(event);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:正如问题评论中提到的,这违反了Android 指南。因此,除非是强制性的,否则请尽量避免使用它。