【问题标题】:How to check whether the navigation drawer is open?如何检查导航抽屉是否打开?
【发布时间】:2015-06-27 04:53:24
【问题描述】:

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

@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?

任何帮助将不胜感激。

【问题讨论】:

    标签: android android-fragments navigation navigation-drawer


    【解决方案1】:

    DrawerLayout 有方法 isDrawerOpen(listView) 返回真或假,我猜这会对你有所帮助

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

    在 onBackPressed 中添加上述代码

    【讨论】:

    • if(dLayout.isDrawerOpen(dList)==true){ dLayout.closeDrawers(); } 用了这个,还是一样的问题
    • 这会影响 onKeyDown() 方法吗??
    • 在 oncreate 中分享您与抽屉相关的代码或将其与抽屉示例代码进行比较我猜您在那里做错了什么
    • 加上检查你是否在调用 super.onBackPressed();尝试评论它并检查
    【解决方案2】:

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

    1. 初始化DrawerLayout 视图

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

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

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

    1. 在您的主要活动中,创建一个内部类,它是DrawerLayout.DrawerListener 的子类。 DrawerLayout 类实现了 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. 将您的操作放入您要使用的功能中。在我的示例中,如果用户与抽屉式导航交互,我将关闭软键盘。在你的主要活动中像这样声明 InputMethodManager:

      var imm: InputMethodManager = this.getSystemService(Activity.INPUT_METHOD_SERVICE)
      
    3. 将你的自定义 DrawerListener 添加到 DrawerLayout(我把它放在 onCreate 方法中)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多