如何检查导航抽屉是否打开?

How to check whether the navigation drawer is open?

我有一个带导航抽屉的 activity。下面是我的代码。

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if(dLayout.isDrawerOpen(GravityCompat.START)==true) {
                 dLayout.closeDrawers();
                }

            else
            {
            doExit();
            }
        }

        return super.onKeyDown(keyCode, event);
    }

    private void doExit() {

        AlertDialog.Builder alertDialog = new AlertDialog.Builder(
                FirstSelection.this);

        alertDialog.setPositiveButton("Yes", new OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                finish();
            }
        });

根据此代码,当用户按下后退按钮时,如果导航抽屉已打开,则关闭抽屉导航,否则将调用 doExit(); 方法。但就我而言,其他条件工作正常,但是当我在抽屉打开时按下后退按钮时,整个应用程序关闭。我遵循了这段代码 How to detect if navigation drawer is open?

如有任何帮助,我们将不胜感激。

DrawerLayout 有方法 isDrawerOpen(listView) returns true or false 我猜这对你有帮助

if (mDrawerLayout.isDrawerOpen(mDrawerList)) {
            mDrawerLayout.closeDrawer(mDrawerList);
        } 

在 onBackPressed 中添加上面的代码

以下是在 Kotlin 中执行此操作的一般步骤。

  1. 初始化 DrawerLayout 视图

    val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
    
  2. 检查抽屉是否打开

    if(drawerLayout.isDrawerOpen(GravityCompat.START)){
        Log.d("Drawer","open")
    }
    

如果您想在抽屉打开或关闭时自动执行操作,您可以执行以下操作。

  1. 在您的主 activity 中,创建一个内部 class,它是 DrawerLayout.DrawerListener 的子class。 DrawerLayout class 实现了 DrawerListener 接口。

    inner class CustomDrawer : DrawerLayout.DrawerListener{
      override fun onDrawerStateChanged(newState: Int) {
      }
    
      override fun onDrawerSlide(drawerView: View, slideOffset: Float) {
        imm.hideSoftInputFromWindow(drawerView?.getWindowToken(), 0)
      }
    
      override fun onDrawerClosed(drawerView: View) {
        imm.hideSoftInputFromWindow(drawerView?.getWindowToken(), 0)
      }
    
      override fun onDrawerOpened(drawerView: View) {
        imm.hideSoftInputFromWindow(drawerView?.getWindowToken(), 0)
      }
    }
    
  2. 把你的动作放在你想使用的函数中。在我的示例中,如果用户与导航抽屉交互,我将关闭软键盘。在你的 main activity:

    中像这样声明 InputMethodManager
    var imm: InputMethodManager = this.getSystemService(Activity.INPUT_METHOD_SERVICE)
    
  3. 将自定义的 DrawerListener 添加到 drawerLayout(我把它放在 onCreate 方法中)

    var drawerListener = CustomDrawer()
    drawerLayout.addDrawerListener(drawerListener)