DrawerLayout + Toolbar中摁下退回键关闭应用而不是菜单的解决办法。

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

建议使用第一种,个人测试第二种会有卡顿,点击返回键再点击菜单按钮,菜单内容会一会儿才出现,第一种就不会。

时间: 2024-10-12 03:22:39

DrawerLayout + Toolbar中摁下退回键关闭应用而不是菜单的解决办法。的相关文章

angularjs中select下拉选择第一个选项为空白的解决办法

在angular设置select时,由于没有设置默认的选择项,就会导致第一个option中的值为undefined,选择其他值时,option为undefined的选项却自动消失了,这说明是在代码中没有设置select的默认选项.如果select有值,则显示正常.在代码中,初始化select的默认值即可.更改代码如下: <select ng-model="prov" ng-change="changeProv()" ng-init="prov='si

IE下iframe中使用滤镜document.selection.createRange().text获取不到值得解决办法

通常的写法是select方法后跟一个blur方法,但是这里我们不能使用blur方法,应该将blur改为window.parent.document.body.focus(); IE下iframe中使用滤镜document.selection.createRange().text获取不到值得解决办法,布布扣,bubuko.com

Eclipse中项目全部报错----项目全部打红叉的解决办法

今天遇到一个超级郁闷的事情,Eclipse新建的项目全部都打有红叉,我起初以为自 己可能是因为这两天一直在配置NDK开发环境方面的东西,是不是一不小心把那个地方给配置了,然后新建项目时项目都会出现红叉的效果.然后我clean了 一下,遭大糕了,所有的项目都出错了. 打开下面的错误提示: 错误的意思:Debug Certificate 过期了的缘故.百度了一下,果然也有遇到相似的问题,说是牵涉了一个私钥的时间期限问题. 解决办法是:进入:C:\Documents and Settings\Admi

您在wp-config.php文件中提供的数据库用户名和密码可能不正确 的解决办法

您在wp-config.php文件中提供的数据库用户名和密码可能不正确 的解决办法 (2015-09-18 23:01:40) 标签: it 技术 经验 wordpress 网站 访问wp-admin/install.php出错:数据库连接错误.您在wp-config.php文件中提供的数据库用户名和密码可能不正确 然后看了下百度,都说是数据库没有连接成功造成的. 那么怎么设置?我整了几次没搞成功,最后还是给解决了.下面我把我设置成功的过程记录下来,以后能用到,也能帮到大家. 1.在htdocs

Fiddler下Firefox提示“您的连接并不安全”的解决办法

一.版本信息 Firefox 最新版本V46.0.1 Fiddler 最新版本V4.6.2.3 二.错误信息 开启fiddlers的https协议捕获的方法,百度上可以查到不再赘述,直接放张图(Tools - Fiddlers Options……). 开启https协议捕获之后,用firefox访问任何https协议的网址,都会提示如下图所示的"你的连接并不安全"的提示. 三.解决办法 首先说明,网上有很多过时的方法,譬如: 1.修改firefox 的 隐藏配置 about:confi

Linux 下文件名乱码(无效的编码)的解决办法

文件是在WIndows 下创建的,Windows 的文件名中文编码默认为GBK,而Linux中默认文件名编码为UTF8,由于编码不一致所以导致了文件名乱码的问题,解决这个问题需要对文件名进行转码. sudo apt-get install convmv convmv 使用方法:convmv -f 源编码 -t 新编码 [选项] 文件名常用参数:-r 递归处理子文件夹–notest 真正进行操作,默认情况下是不对文件进行真实操作–list 显示所有支持的编码–unescap 可以做一下转义,比如把

ie、firefox、chrome中关于style=&quot;display:block&quot; 引发的页面布局错乱的解决办法

ie.firefox.chrome中关于style="display:block" 引发的页面布局错乱的解决办法: table中tr 添加style="display:block" 导致页面布局错乱 对table中tr 不显示时,添加style="display:none",ie.chrome.firefox等都没有问题.但是如果想要显示某个tr,就不能使用style="display:block"了,因为,在ie下,可以正常

在Android程序中使用Modbus协议时报 java.net.SocketException: recvfrom failed: ECONNRESET解决办法

最近在开发基本Modbus协议的Android端PLC控制程序,C#版程序没有任何问题,移到JAVA下出现各种问题,其中比较苦恼的是java.net.SocketException: recvfrom failed: ECONNRESET错误. 开始我的解决方法是每次向PLC发送一条数据后关掉socket,但是这样做太极端了. 经过分析发现是由于发送的数据包大小我设定为256,当写入1个寄存器值时,Modbus服务端直接报错,关掉了socket连接,将发送的数据包大小改成实际的大小后解决问题.

IOS7 UITableView一行滑动删除后 被删除行的下一行的点击事件将被忽略解决办法

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {     returnUITableViewCellEdit