【问题标题】:How to detect the touch event outside the navigation drawer如何检测导航抽屉外的触摸事件
【发布时间】:2015-12-15 07:20:01
【问题描述】:

我已经在我的应用程序中实现了 Android 导航抽屉。当用户触摸导航抽屉的外侧时,我可以打开/关闭抽屉。当用户触摸/单击导航抽屉外侧时,你们中的任何人都可以帮助我检测触摸/单击事件吗?我需要在该事件中执行一些功能。 请查看随附的屏幕截图。 任何帮助都会得到帮助。

【问题讨论】:

  • 在我的情况下,同样的问题也找到了任何解决方案,在我的情况下,b'coz 以下可接受的答案不起作用。

标签: android navigation-drawer toolbar


【解决方案1】:

您必须在dispatchTouchEvent() 方法中处理触摸位置。查看更多关于触摸层次结构here

@Override    
public boolean dispatchTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_UP) {
        if (mDrawerLayout.isDrawerOpen(mRightDrawerListView)) {

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

            View toolbarView = findViewById(R.id.toolbar);
            int[] toolbarLocation = new int[2];
            toolbarView.getLocationOnScreen(toolbarLocation);
            Rect toolbarViewRect = new Rect(toolbarLocation[0],
                toolbarLocation[1],
                toolbarLocation[0] + toolbarView.getWidth(),
                toolbarLocation[1] + toolbarView.getHeight());


            if (!(rect.contains((int) event.getX(), (int) event.getY())) && !toolbarViewRect.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) {
        //make http call/db request
        Toast.makeText(this, "Hello..", Toast.LENGTH_SHORT).show();
    }
    return super.dispatchTouchEvent(event);
}

【讨论】:

    【解决方案2】:

    您可能会花一些时间来检查一下。

    DrawerLayout.DrawerListener

    我希望它对你有帮助。

    一个例子:

            DrawerLayout drawerLayout = activity.findViewById(R.id.drawer_layout);
            drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
                @Override
                public void onDrawerSlide(@NonNull View view, float v) {
    
                }
    
                @Override
                public void onDrawerOpened(@NonNull View view) {
    
                }
    
                @Override
                public void onDrawerClosed(@NonNull View view) {
    
                }
    
                @Override
                public void onDrawerStateChanged(int i) {
    
                }
            });
    

    祝你好运。

    【讨论】:

      【解决方案3】:

      你可以使用onDrawerClosed

      当您触摸外屏时onDrawerClosed 将在导航关闭后调用 抽屉

      public void onDrawerClosed(View view) {
                  super.onDrawerClosed(view);
                  //do  here
      }
      

      【讨论】:

      • 感谢您的回答。 onDrawerClosed(View view) 会在很多场景中调用。这对我不起作用。
      • 可能对this有帮助
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多