Android下DrawerLayout的使用
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工具类
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的使用的更多相关文章
- Android 下拉刷新上拉载入 多种应用场景 超级大放送(上)
转载请标明原文地址:http://blog.csdn.net/yalinfendou/article/details/47707017 关于Android下拉刷新上拉载入,网上的Demo太多太多了,这 ...
- Android下/data/data/<package_name>/files读写权限
今天将更新模块拿到android上面测试的时候,发现在创建writablepath.."upd/"目录的时候出现Permission Denied提示BTW:我使用的是lfs来创建 ...
- Android下Cocos2d创建HelloWorld工程
最近在搭建Cocos2d的环境,结果各种问题,两人弄了一天才能搞好一个环境-! -_-!! 避免大家也可能会遇到我这种情况,所以写一个随笔,让大家也了解下如何搭建吧- 1.环境安装准备 下载 tadp ...
- Android下读取logcat的信息
有时我们需要在程序执行进程中遇到一些异常,需要收集一logcat的信息,android下就可以使用以下方法获取: private static String getLogcatInfo(){ Stri ...
- Android下OpenCV的环境搭建
目录(?)[-] 前言 系统环境 相关工具 Android ADT环境搭建 Android SDK环境变量的配置 Android NDK的安装与配置 OpenCV for Android 环境搭建 基 ...
- Android下添加新的自定义键值和按键处理流程
Android下添加新的自定义键值和按键处理流程 说出来不怕大家笑话,我写这篇博客的原因在于前几天去一个小公司面试Android系统工程师,然后在面试的时候对方的技术总监问了我 ...
- Android下的数据储存方式(三)
Android下最好的数据储存方式:关系型数据库sqlite. 数据库的创建:使用SqliteOpenHelper类 结合SqliteOpenHelper类和SQLiteDatabase类的帮 ...
- 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...
- 转:RTC搭建android下三层应用程序访问服务器MsSql-客户端
原文:http://www.cnblogs.com/delphi007/p/3346084.html android下stringgrid已知问题: 通过点击时获取对应行的值有问题,在win下调试正常 ...
随机推荐
- 机器学习基石:02 Learning to Answer Yes/No
Perceptron Learning Algorithm 感知器算法, 本质是二元线性分类算法,即用一条线/一个面/一个超平面将1,2维/3维/4维及以上数据集根据标签的不同一分为二. 算法确定后, ...
- 教你从手机中提取system镜像制作线刷救砖包的简单方法
其实在制作刷机包的过程中,有时候没有官方或者第三方提供的救砖包(线刷),那怎么办?常规的方法有两种:(此处为常规方法,回读的方式暂不说明) 1.卡刷包转线刷包 2.dd命令导出分区镜像 ...
- [HNOI 2008]越狱
Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果 相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 I ...
- 计蒜客NOIP模拟赛4 D2T2 跑步爱天天
YOUSIKI 在 noip2016 的一道<天天爱跑步>的题爆零后,潜心研究树上问题,成为了一代大师,于是皮皮妖为了测验他,出了一道题,名曰<跑步爱天天>. 有一个以 1 为 ...
- Linux添加系统调用的两种方法
前言 系统调用的基本原理 系统调用其实就是函数调用,只不过调用的是内核态的函数,但是我们知道,用户态是不能随意调用内核态的函数的,所以采用软中断的方式从用户态陷入到内核态.在内核中通过软中断0X80, ...
- [BZOJ]1071 组队(SCOI2007)
一道比较NB的套路题. Description NBA每年都有球员选秀环节.通常用速度和身高两项数据来衡量一个篮球运动员的基本素质.假如一支球队里速度最慢的球员速度为minV,身高最矮的球员高度为mi ...
- win7+Apache 设置域名指向本地文件夹
实现:浏览器地址栏输入 www.bnzoo.com 访问 D:/www 系统:win7旗舰版+Apache 步骤: 1.打开文件 C:\Windows\System32\drivers\etc\hos ...
- 利用maven打jar包(项目来自GitHub)
1.首先去GitHub上clone一个项目.(前提,maven项目) 2.切换到项目根目录. 3.执行mvn package. 第一次操作失败: 分析错误原因(javac):maven无法找到jdk, ...
- java海量大文件数据处理方式
1. 给定a.b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a.b文件共同的url? 方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4 ...
- python实现编写windows服务
使用python编写windows服务 最近测试服务器上经常发生磁盘空间不足,每次手动清除比较麻烦,所以写个windows服务定时清理下.中间也遇到过几个坑,一起记录下来. 1.python实现win ...