Android下DrawerLayout的使用

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

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

其实使用起来非常简单。

步骤

添加容器

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

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

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

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

添加抽屉

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

dependencies {
……
compile 'com.android.support:design:23.0.1'
}

也可以通过Studio搜索添加

导入依赖以后,添加布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"> <TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="我是主界面的内容"
android:textSize="40dp" /> <android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"> <TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000"
android:gravity="center"
android:text="我是侧拉栏的内容"
android:textColor="#FFFFFF"
android:textSize="20dp" /> </android.support.design.widget.NavigationView> </android.support.v4.widget.DrawerLayout>

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

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

使用

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

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

package com.example.kongqw.myapplication;

import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast; public class MainActivity extends AppCompatActivity implements DrawerLayout.DrawerListener { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 获取装抽屉的容器
DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
// 添加对抽屉的监听
drawerLayout.setDrawerListener(this);
} @Override
public void onDrawerSlide(View drawerView, float slideOffset) {
ToastUtil.show(this, "slideOffset = " + slideOffset);
} @Override
public void onDrawerOpened(View drawerView) {
ToastUtil.show(this, "抽屉开");
} @Override
public void onDrawerClosed(View drawerView) {
ToastUtil.show(this, "抽屉关");
} @Override
public void onDrawerStateChanged(int newState) {
// ToastUtil.show(this, "抽屉状态改变");
}
}
  • 效果图

控制打开抽屉

/**
* 抽屉开
*
* @param view
*/
public void drawerOpen(View view) {
mDrawerLayout.openDrawer(mDrawer);
}
  • 效果图

控制关闭抽屉

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

/**
* 抽屉关
*
* @param view
*/
public void drawerClose(View view) {
mDrawerLayout.closeDrawer(mDrawer);
}

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

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

让抽屉以开的状态锁住

/**
* 让抽屉以开的状态锁住
*
* @param view
*/
public void lockModeLockedOpen(View view) {
// 将抽屉以开的状态锁住
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN);
}
  • 效果图

让抽屉以关的状态锁住

/**
* 让抽屉以关的状态锁住
*
* @param view
*/
public void lockModeLockedClose(View view) {
// 将抽屉以关的状态锁住
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}
  • 效果图

让抽屉从右边滑出

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

<android.support.design.widget.NavigationView
……
android:layout_gravity="end"> <RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
……
</RelativeLayout>
</android.support.design.widget.NavigationView>
  • 效果图

修改抽屉宽度

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

源码

下面是讲解例子源码

XML布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="right"
android:orientation="vertical"> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="drawerOpen"
android:text="抽屉开" /> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="drawerClose"
android:text="抽屉关" /> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="isDrawerOpen"
android:text="获取抽屉状态" /> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="lockModeLockedOpen"
android:text="让抽屉以开的状态锁住" /> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="lockModeLockedClose"
android:text="让抽屉以关的状态锁住" />
</LinearLayout> <android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"> <TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000"
android:gravity="center"
android:text="我是侧拉栏的内容"
android:textColor="#FFFFFF"
android:textSize="20dp" /> </android.support.design.widget.NavigationView> </android.support.v4.widget.DrawerLayout>

测试类

package com.example.kongqw.myapplication;

import android.support.design.widget.NavigationView;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View; public class MainActivity extends AppCompatActivity implements DrawerLayout.DrawerListener { private DrawerLayout mDrawerLayout;
private NavigationView mDrawer; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取装抽屉的容器
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
// 获取抽屉
mDrawer = (NavigationView) findViewById(R.id.nav_view);
// 添加对抽屉的监听
mDrawerLayout.setDrawerListener(this);
} /**
* 抽屉开
*
* @param view
*/
public void drawerOpen(View view) {
mDrawerLayout.openDrawer(mDrawer);
} /**
* 抽屉关
*
* @param view
*/
public void drawerClose(View view) {
mDrawerLayout.closeDrawer(mDrawer);
} /**
* 获取抽屉状态
*
* @param view
*/
public void isDrawerOpen(View view) {
boolean isOpen = mDrawerLayout.isDrawerOpen(mDrawer);
ToastUtil.show(this, "抽屉状态:" + (isOpen ? "开" : "关"));
} /**
* 让抽屉以开的状态锁住
*
* @param view
*/
public void lockModeLockedOpen(View view) {
// 将抽屉以开的状态锁住
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN);
} /**
* 让抽屉以关的状态锁住
*
* @param view
*/
public void lockModeLockedClose(View view) {
// 将抽屉以关的状态锁住
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
} /*
* 下面监听抽屉开关的回调方法
* ********************************************************************/
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
ToastUtil.show(this, "slideOffset = " + slideOffset);
} @Override
public void onDrawerOpened(View drawerView) {
ToastUtil.show(this, "抽屉开");
} @Override
public void onDrawerClosed(View drawerView) {
ToastUtil.show(this, "抽屉关");
} @Override
public void onDrawerStateChanged(int newState) {
// ToastUtil.show(this, "抽屉状态改变");
}
}

Toast工具类

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

package com.example.kongqw.myapplication;

import android.content.Context;
import android.widget.Toast; /**
* Created by kongqw on 2015/11/12.
*/
public class ToastUtil { private ToastUtil() {
} private static Toast mToast; public static void show(Context context, String string) {
if (null == mToast) {
mToast = Toast.makeText(context, "", Toast.LENGTH_SHORT);
}
mToast.setText(string);
mToast.show();
}
}

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. 使用 dotnet cli 命令上传 nuget 程序包

    前言 前面写了一篇文章介绍了如何将自己的程序集打包成nuget package并上传到nuget.org,传送门.全部是通过网页端来进行操作的,现在介绍一种比较方便快捷的方法就是用dotnet cli ...

  2. [LeetCode] Daily Temperatures 日常温度

    Given a list of daily temperatures, produce a list that, for each day in the input, tells you how ma ...

  3. [LeetCode] Squirrel Simulation 松鼠模拟

    There's a tree, a squirrel, and several nuts. Positions are represented by the cells in a 2D grid. Y ...

  4. HTTP响应状态解析

    100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应.服务器必须在请求完成后向客 ...

  5. SpringMVC 教程 - Controller

    原文地址:https://www.codemore.top/cates/Backend/post/2018-04-10/spring-mvc-controller 声明Controller Contr ...

  6. 洛谷P2480 [SDOI2010]古代猪文

    要求(图是盗来的QAQ) 首先用欧拉定理把幂模一下,直接就是MOD-1了 然后发现MOD-1可以分解为2,3,4679,35617,都是质数,可以直接用Lucas定理 然后用中国剩余定理合并一下即可 ...

  7. DP测试总结

    T1:三取方格数 题目描述 设有N*N的方格图,我们将其中的某些方格填入正整数,而其他的方格中放入0.某人从图得左上角出发,可以向下走,也可以向右走,直到到达右下角.在走过的路上,他取走了方格中的数. ...

  8. NOIP2014-5-17模拟赛

    Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一届的学弟学妹,邪恶的chenzeyu97发现一位学弟与他同名,于是他当起了善良的学长233 "来来来,学 ...

  9. bzoj2811[Apio2012]Guard 贪心

    2811: [Apio2012]Guard Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 905  Solved: 387[Submit][Statu ...

  10. python3 字符串str 教程

    字符串可以用单引号或双引号来创建. Python 不支持单字符类型,单字符也在Python也是作为一个字符串使用. 例: var1 = 'Hello World!' var2 = "Pyth ...