首先,关于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