首先,关于DrawerLayout的一些了解,他是可以用于制作菜单的一个view,其中他的第一个view‘是内容区域,然后他还可以有两个view,根据他们的layout_gravity属性决定是右侧还是左侧菜单,其中等于left是左侧,等于right是右侧菜单。一般菜单都是一个listview。
我们使用ToolBar代替原来的ActionBar,让他和DrawerLayout一起使用。点击ToolBar的Navigation的图标的时候可以显示或者隐藏菜单,还有炫的效果,类似知乎APP,然后有一个问题,当我们点击显示出菜单的时候,假如点击返回键,那么他就会推出应用而不是关闭菜单,这不是我们想要的结果,解决它有两个办法。
一,我们是通过ActionBarDrawerToggle来监听DrawerLayout的打开关闭的,所以,我们可以重写ActionBarDrawerToggleonDrawerClosed和onDrawerOpend方法,然后重写onKeyDown方法,设置一个flag。具体代码如下:
mActionBarDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.open, R.string.close) { @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); flag = false; } @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); flag = true; } }; mActionBarDrawerToggle.syncState(); mDrawerLayout.setDrawerListener(mActionBarDrawerToggle);
public boolean onKeyDown(int keyCode, KeyEvent event) { if(flag) { mDrawerLayout.closeDrawers(); return true; } return super.onKeyDown(keyCode, event); }
第二种解决方法,由于我们的左侧菜单(我的是)是使用Fragment来制作的,所以可以通过他的hid和show方法实现。
具体代码如下:
mActionBarDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.open, R.string.close) { @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); flag = false; } @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); FragmentManager fm = getSupportFragmentManager(); fm.beginTransaction().show(mLeftMenuFragment).commit(); flag = true; } }; mActionBarDrawerToggle.syncState(); mDrawerLayout.setDrawerListener(mActionBarDrawerToggle);
public boolean onKeyDown(int keyCode, KeyEvent event) { if(flag) { FragmentManager fm = getSupportFragmentManager(); fm.beginTransaction().hide(mLeftMenuFragment).commit(); return true; } return super.onKeyDown(keyCode, event); }
建议使用第一种,个人测试第二种会有卡顿,点击返回键再点击菜单按钮,菜单内容会一会儿才出现,第一种就不会。
DrawerLayout + Toolbar中摁下退回键关闭应用而不是菜单的解决办法。
原文地址:http://blog.csdn.net/liweijie_chengxuyuan/article/details/45484973