Android下DrawerLayout的使用

DrawerLayout见名知意,就是一个具有抽屉效果的布局,看看这个效果图,是不是感觉很炫酷

这么炫的效果其实不一定非要用类似一些SlidingMenu这样的框架才能实现,原生库就有对这种效果的支持,今天我们就一起来学习一下DrawerLayout的使用。

其实使用起来非常简单。

步骤

添加容器

显示抽屉效果需要一个容器,不过当然不能用RelativeLayout或者LinearLayout这样的容器了,我们需要使用「android.support.v4.widget.DrawerLayout」这个布局。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. tools:context=".MainActivity">
  7. </android.support.v4.widget.DrawerLayout>

我想说到此,我们已经完成快一半了,是不是不太相信,这么简单?

我们再添加一个抽屉的布局,效果就实现了,就是这么简单。

添加抽屉

添加抽屉布局也很简单,任然需要一个抽屉的容器,这个容器叫做「android.support.design.widget.NavigationView」,我要需要导入Library以后才可以使用,可以在gradle文件里添加依赖

  1. dependencies {
  2. ……
  3. compile 'com.android.support:design:23.0.1'
  4. }

也可以通过Studio搜索添加

导入依赖以后,添加布局

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. tools:context=".MainActivity">
  7. <TextView
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent"
  10. android:gravity="center"
  11. android:text="我是主界面的内容"
  12. android:textSize="40dp" />
  13. <android.support.design.widget.NavigationView
  14. android:id="@+id/nav_view"
  15. android:layout_width="wrap_content"
  16. android:layout_height="match_parent"
  17. android:layout_gravity="start"
  18. android:fitsSystemWindows="true">
  19. <TextView
  20. android:layout_width="match_parent"
  21. android:layout_height="match_parent"
  22. android:background="#000000"
  23. android:gravity="center"
  24. android:text="我是侧拉栏的内容"
  25. android:textColor="#FFFFFF"
  26. android:textSize="20dp" />
  27. </android.support.design.widget.NavigationView>
  28. </android.support.v4.widget.DrawerLayout>

到此为止,我们已经完成了抽屉的效果,看一下效果图

接下来,我们再研究一下如何使用(控制),就大功告成了。

使用

说到使用,无非就是控制抽屉的开关,锁定、宽度,这些内容

监听抽屉的开关和展开状态

  1. package com.example.kongqw.myapplication;
  2. import android.support.v4.widget.DrawerLayout;
  3. import android.support.v7.app.ActionBarDrawerToggle;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.widget.Toast;
  8. public class MainActivity extends AppCompatActivity implements DrawerLayout.DrawerListener {
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.activity_main);
  13. // 获取装抽屉的容器
  14. DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
  15. // 添加对抽屉的监听
  16. drawerLayout.setDrawerListener(this);
  17. }
  18. @Override
  19. public void onDrawerSlide(View drawerView, float slideOffset) {
  20. ToastUtil.show(this, "slideOffset = " + slideOffset);
  21. }
  22. @Override
  23. public void onDrawerOpened(View drawerView) {
  24. ToastUtil.show(this, "抽屉开");
  25. }
  26. @Override
  27. public void onDrawerClosed(View drawerView) {
  28. ToastUtil.show(this, "抽屉关");
  29. }
  30. @Override
  31. public void onDrawerStateChanged(int newState) {
  32. // ToastUtil.show(this, "抽屉状态改变");
  33. }
  34. }
  • 效果图

控制打开抽屉

  1. /**
  2. * 抽屉开
  3. *
  4. * @param view
  5. */
  6. public void drawerOpen(View view) {
  7. mDrawerLayout.openDrawer(mDrawer);
  8. }
  • 效果图

控制关闭抽屉

默认效果,点击任何位置都会关闭

  1. /**
  2. * 抽屉关
  3. *
  4. * @param view
  5. */
  6. public void drawerClose(View view) {
  7. mDrawerLayout.closeDrawer(mDrawer);
  8. }

获取抽屉状态(打开还是关闭)

  1. /**
  2. * 获取抽屉状态
  3. *
  4. * @param view
  5. */
  6. public void isDrawerOpen(View view) {
  7. boolean isOpen = mDrawerLayout.isDrawerOpen(mDrawer);
  8. ToastUtil.show(this, "抽屉状态:" + (isOpen ? "开" : "关"));
  9. }
  • 效果图

让抽屉以开的状态锁住

  1. /**
  2. * 让抽屉以开的状态锁住
  3. *
  4. * @param view
  5. */
  6. public void lockModeLockedOpen(View view) {
  7. // 将抽屉以开的状态锁住
  8. mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN);
  9. }
  • 效果图

让抽屉以关的状态锁住

  1. /**
  2. * 让抽屉以关的状态锁住
  3. *
  4. * @param view
  5. */
  6. public void lockModeLockedClose(View view) {
  7. // 将抽屉以关的状态锁住
  8. mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
  9. }
  • 效果图

让抽屉从右边滑出

只要将抽屉容器里的layout_gravity改为end就可以了

  1. <android.support.design.widget.NavigationView
  2. ……
  3. android:layout_gravity="end">
  4. <RelativeLayout
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent">
  7. ……
  8. </RelativeLayout>
  9. </android.support.design.widget.NavigationView>
  • 效果图

修改抽屉宽度

直接修改抽屉容器里的layout_width调整宽度属性即可

源码

下面是讲解例子源码

XML布局

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:id="@+id/drawerLayout"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".MainActivity">
  8. <LinearLayout
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent"
  11. android:gravity="right"
  12. android:orientation="vertical">
  13. <Button
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:onClick="drawerOpen"
  17. android:text="抽屉开" />
  18. <Button
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:onClick="drawerClose"
  22. android:text="抽屉关" />
  23. <Button
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content"
  26. android:onClick="isDrawerOpen"
  27. android:text="获取抽屉状态" />
  28. <Button
  29. android:layout_width="wrap_content"
  30. android:layout_height="wrap_content"
  31. android:onClick="lockModeLockedOpen"
  32. android:text="让抽屉以开的状态锁住" />
  33. <Button
  34. android:layout_width="wrap_content"
  35. android:layout_height="wrap_content"
  36. android:onClick="lockModeLockedClose"
  37. android:text="让抽屉以关的状态锁住" />
  38. </LinearLayout>
  39. <android.support.design.widget.NavigationView
  40. android:id="@+id/nav_view"
  41. android:layout_width="wrap_content"
  42. android:layout_height="match_parent"
  43. android:layout_gravity="start"
  44. android:fitsSystemWindows="true">
  45. <TextView
  46. android:layout_width="match_parent"
  47. android:layout_height="match_parent"
  48. android:background="#000000"
  49. android:gravity="center"
  50. android:text="我是侧拉栏的内容"
  51. android:textColor="#FFFFFF"
  52. android:textSize="20dp" />
  53. </android.support.design.widget.NavigationView>
  54. </android.support.v4.widget.DrawerLayout>

测试类

  1. package com.example.kongqw.myapplication;
  2. import android.support.design.widget.NavigationView;
  3. import android.support.v4.widget.DrawerLayout;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. public class MainActivity extends AppCompatActivity implements DrawerLayout.DrawerListener {
  8. private DrawerLayout mDrawerLayout;
  9. private NavigationView mDrawer;
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_main);
  14. // 获取装抽屉的容器
  15. mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
  16. // 获取抽屉
  17. mDrawer = (NavigationView) findViewById(R.id.nav_view);
  18. // 添加对抽屉的监听
  19. mDrawerLayout.setDrawerListener(this);
  20. }
  21. /**
  22. * 抽屉开
  23. *
  24. * @param view
  25. */
  26. public void drawerOpen(View view) {
  27. mDrawerLayout.openDrawer(mDrawer);
  28. }
  29. /**
  30. * 抽屉关
  31. *
  32. * @param view
  33. */
  34. public void drawerClose(View view) {
  35. mDrawerLayout.closeDrawer(mDrawer);
  36. }
  37. /**
  38. * 获取抽屉状态
  39. *
  40. * @param view
  41. */
  42. public void isDrawerOpen(View view) {
  43. boolean isOpen = mDrawerLayout.isDrawerOpen(mDrawer);
  44. ToastUtil.show(this, "抽屉状态:" + (isOpen ? "开" : "关"));
  45. }
  46. /**
  47. * 让抽屉以开的状态锁住
  48. *
  49. * @param view
  50. */
  51. public void lockModeLockedOpen(View view) {
  52. // 将抽屉以开的状态锁住
  53. mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN);
  54. }
  55. /**
  56. * 让抽屉以关的状态锁住
  57. *
  58. * @param view
  59. */
  60. public void lockModeLockedClose(View view) {
  61. // 将抽屉以关的状态锁住
  62. mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
  63. }
  64. /*
  65. * 下面监听抽屉开关的回调方法
  66. * ********************************************************************/
  67. @Override
  68. public void onDrawerSlide(View drawerView, float slideOffset) {
  69. ToastUtil.show(this, "slideOffset = " + slideOffset);
  70. }
  71. @Override
  72. public void onDrawerOpened(View drawerView) {
  73. ToastUtil.show(this, "抽屉开");
  74. }
  75. @Override
  76. public void onDrawerClosed(View drawerView) {
  77. ToastUtil.show(this, "抽屉关");
  78. }
  79. @Override
  80. public void onDrawerStateChanged(int newState) {
  81. // ToastUtil.show(this, "抽屉状态改变");
  82. }
  83. }

Toast工具类

相关博客:http://blog.csdn.net/q4878802/article/details/48782705

  1. package com.example.kongqw.myapplication;
  2. import android.content.Context;
  3. import android.widget.Toast;
  4. /**
  5. * Created by kongqw on 2015/11/12.
  6. */
  7. public class ToastUtil {
  8. private ToastUtil() {
  9. }
  10. private static Toast mToast;
  11. public static void show(Context context, String string) {
  12. if (null == mToast) {
  13. mToast = Toast.makeText(context, "", Toast.LENGTH_SHORT);
  14. }
  15. mToast.setText(string);
  16. mToast.show();
  17. }
  18. }

Android下DrawerLayout的使用的更多相关文章

  1. Android 下拉刷新上拉载入 多种应用场景 超级大放送(上)

    转载请标明原文地址:http://blog.csdn.net/yalinfendou/article/details/47707017 关于Android下拉刷新上拉载入,网上的Demo太多太多了,这 ...

  2. Android下/data/data/<package_name>/files读写权限

    今天将更新模块拿到android上面测试的时候,发现在创建writablepath.."upd/"目录的时候出现Permission Denied提示BTW:我使用的是lfs来创建 ...

  3. Android下Cocos2d创建HelloWorld工程

    最近在搭建Cocos2d的环境,结果各种问题,两人弄了一天才能搞好一个环境-! -_-!! 避免大家也可能会遇到我这种情况,所以写一个随笔,让大家也了解下如何搭建吧- 1.环境安装准备 下载 tadp ...

  4. Android下读取logcat的信息

    有时我们需要在程序执行进程中遇到一些异常,需要收集一logcat的信息,android下就可以使用以下方法获取: private static String getLogcatInfo(){ Stri ...

  5. Android下OpenCV的环境搭建

    目录(?)[-] 前言 系统环境 相关工具 Android ADT环境搭建 Android SDK环境变量的配置 Android NDK的安装与配置 OpenCV for Android 环境搭建 基 ...

  6. Android下添加新的自定义键值和按键处理流程

            Android下添加新的自定义键值和按键处理流程     说出来不怕大家笑话,我写这篇博客的原因在于前几天去一个小公司面试Android系统工程师,然后在面试的时候对方的技术总监问了我 ...

  7. Android下的数据储存方式(三)

      Android下最好的数据储存方式:关系型数据库sqlite.   数据库的创建:使用SqliteOpenHelper类 结合SqliteOpenHelper类和SQLiteDatabase类的帮 ...

  8. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  9. 转:RTC搭建android下三层应用程序访问服务器MsSql-客户端

    原文:http://www.cnblogs.com/delphi007/p/3346084.html android下stringgrid已知问题: 通过点击时获取对应行的值有问题,在win下调试正常 ...

随机推荐

  1. 小白学习java设计模式之策略模式

    策略模式:1.分析项目中的变化部分与不变部分(每个设计模式都要分析的)2.多用组合少用继承;用行为类组合,而不是行为继承,更具有弹性直接上代码: package com.wz.oneStrategis ...

  2. servlet之cookie实现

    三个servlet的实现: package app02c;import java.io.IOException;import java.io.PrintWriter;import javax.serv ...

  3. [JSOI 2008]星球大战starwar

    Description 题库链接 给你一张 \(n\) 点, \(m\) 条边的无向图,每次摧毁一个点,问你剩下几个联通块. \(1\leq n\leq 2m,1\leq m\leq 200000\) ...

  4. [JSOI2009]游戏Game

    Description Input 输入数据首先输入两个整数N,M,表示了迷宫的边长. 接下来N行,每行M个字符,描述了迷宫. Output 若小AA能够赢得游戏,则输出一行"WIN&quo ...

  5. ●BZOJ 1969 [Ahoi2005]LANE 航线规划

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1969 题解: 线段树,树链剖分,反向考虑思路是很巧妙,但是感觉代码真的恶心.. 反着考虑,先 ...

  6. ●BZOJ 2006 NOI 2010 超级钢琴

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2006 题解: RMQ + 优先队列 (+ 前缀) 记得在一两个月前,一次考试考了这个题目的简 ...

  7. 【The Time Traveller's Wife】

    After reading The Time Traveller's Wife:      It's a tragedy,I think.But it's mixed with hope.Henry ...

  8. 习题9-3 UVA1629(dp)

    Cake Slicing 题意:有一个n行m列的网格上有一些黑点,要求进行切割,使最后每块上只有一个黑点,求最少的刀数 思路:记忆化搜索,枚举每一条边来切,每一次搜索自己所能切割的所有情况取最小值 但 ...

  9. Serpent.AI – 游戏代理框架(Python)

    Serpent.AI - 游戏代理框架(Python) Serpent.AI是一个简单而强大的新颖框架,可帮助开发人员创建游戏代理.将您拥有的任何视频游戏变成一个成熟的实验的沙箱环境,所有这些都是熟悉 ...

  10. WebDNN:Web浏览器上最快的DNN执行框架

    WebDNN:Web浏览器上最快的DNN执行框架 为什么需要WebDNN? 深层神经网络(DNN)在许多应用中受到越来越多的关注. 然而,它需要大量的计算资源,并且有许多巨大的过程来设置基于执行环境的 ...