【问题标题】:How to detect if navigation drawer is open?如何检测导航抽屉是否打开?
【发布时间】:2014-02-07 17:10:06
【问题描述】:

标题说明了一切。我想要做的就是知道导航抽屉是否打开。我在网上搜索了很多,找到了方法isDrawerOpen(int drawerGravity)但是找不到一个令人满意的答案来解释如何在方法中使用它。如果有人向我解释,我将不胜感激。

提前致谢!

【问题讨论】:

  • boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList)。 mDrawerLayout 是抽屉,mDrawerList 是列表视图
  • @Raghunandan 非常感谢!

标签: android android-navigation


【解决方案1】:

假设你已经在 xml 中定义了一个抽屉布局:

DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
...
if(mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
  //drawer is open
}

【讨论】:

  • 这是否意味着抽屉是打开的?
  • 虽然对很多人来说可能很明显,但我想指出,如果从右侧打开抽屉(即 android:layout_gravity = "right"),则应使用 isDrawerOpen(GravityCompat.END))
  • İ如果你想关闭你应该在 if staments drawer.closeDrawer(Gravity.START);
【解决方案2】:
 mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerToggle = new ActionBarDrawerToggle(
            this,                  /* host Activity */
            mDrawerLayout,         /* DrawerLayout object */
            R.drawable.ic_drawer,  /* nav drawer icon to replace 'Up' caret */
            R.string.drawer_open,  /* "open drawer" description */
            R.string.drawer_close  /* "close drawer" description */
            ) {

        /** Called when a drawer has settled in a completely closed state. */
        public void onDrawerClosed(View view) {
            super.onDrawerClosed(view);
            getActionBar().setTitle(mTitle);
        }

        /** Called when a drawer has settled in a completely open state. */
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            getActionBar().setTitle(mDrawerTitle);
        }
    };

    // Set the drawer toggle as the DrawerListener
    mDrawerLayout.setDrawerListener(mDrawerToggle);

那个听众使用:)

【讨论】:

  • 谢谢,但我没有使用带有导航抽屉的操作栏。只需要在方法中使用它!
【解决方案3】:

用途:

mDrawerLayout.isDrawerOpen()方法

例子:

    if(mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
        mDrawerLayout.closeDrawer(Gravity.LEFT); //CLOSE Nav Drawer!
    }else{
        mDrawerLayout.openDrawer(Gravity.LEFT); //OPEN Nav Drawer!
    }

【讨论】:

  • 如果抽屉打开,打开抽屉,否则关闭抽屉:D
【解决方案4】:

通过以下方式可以发现Drawer是打开还是关闭..

 public class YourActivity extends AppCompatActivity implements  DrawerLayout.DrawerListener {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dash_board);

        DrawerLayout drawer=(DrawerLayout)findViewById(R.id.container);
        drawer.setDrawerListener(this);
    }//onCreate()

    @Override
    public void onDrawerOpened(View arg0) {
      //write your code
    }

    @Override
    public void onDrawerClosed(View arg0) {
        //write your code
    }

    @Override
    public void onDrawerSlide(View arg0, float arg1) {
        //write your code
    }

    @Override
    public void onDrawerStateChanged(int arg0) {
        //write your code
    }
}//class

【讨论】:

  • 使用 addDrawerListener 因为 set 已被弃用
【解决方案5】:

检测DrawerLayout打开、关闭、滑动DrawerLayout.DrawerListener

DrawerLayout drawerLayout:
drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
    /**
     * Called when a drawer's position changes.
     *
     * @param slideOffset The new offset of this drawer within its range, from 0-1
     *                    Example when you slide drawer from left to right, slideOffset will increase from 0 - 1 (0 when drawer closed and 1 when drawer display full)
     */
    @Override
    public void onDrawerSlide(@NonNull View drawerView, float slideOffset) {

    }

    @Override
    public void onDrawerOpened(@NonNull View drawerView) {
        // do something when drawer opened
    }

    @Override
    public void onDrawerClosed(@NonNull View drawerView) {
        // do something when drawer closed
    }

    /**
     * Called when the drawer motion state changes. The new state will
     * be one of {@link #STATE_IDLE}, {@link #STATE_DRAGGING} or {@link #STATE_SETTLING}.
     */
    @Override
    public void onDrawerStateChanged(int newState) {

    }
});

检查抽屉是否打开

if(drawerLayout.isDrawerOpen(GravityCompat.START)) // or  GravityCompat.END

【讨论】:

    【解决方案6】:

    shakeJ 的回答是正确的,记住你可以使用 onDrawerSlide 来触发其他功能...例如我用它来更改状态栏颜色。

            /** Called when a drawer has settled in a completely closed state. */
            public void onDrawerClosed(View view) {
                super.onDrawerClosed(view);
                isOpen = false;
            }
    
            /** Called when a drawer has settled in a completely open state. */
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                isOpen = true;
            }
            public void onDrawerSlide(View drawerView,float slideOffset){
                super.onDrawerSlide(drawerView,slideOffset);
                if(!isOpen){
                    setStatusBarColor("#00102b");
                }
                if(isOpen){
                    setStatusBarColor("#EFEFF0");
                }
            }
    

    【讨论】:

      【解决方案7】:

      可能是,我迟到了,但我可以分享新的更新信息。 在给定的代码中,我在 onclick 函数中设置了打开/关闭抽屉。如果抽屉是打开的,它将被关闭,否则打开。这个解决方案基于 RXava DrawerLayout (androidx.drawerlayout.widget.DrawerLayout)。 在我的代码中,我从右到左打开抽屉布局。

       @Override
          public void onClick(View view) {
      
        if (drawerLayout.isDrawerVisible(GravityCompat.END)) {
                          drawerLayout.closeDrawer(GravityCompat.END);
        }else {
                          drawerLayout.openDrawer(GravityCompat.END);
        }
      
      }
      

      注意:如果您从右侧打开抽屉布局,请使用 "GravityCompat.END",并且它是从左侧打开的,而不是使用 "GravityCompat.START"。 享受编码......

      【讨论】:

        【解决方案8】:

        在 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)

        【讨论】:

          猜你喜欢
          • 2015-06-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-05
          相关资源
          最近更新 更多