最近流行 左侧抽屉式的导航条菜单,知乎,360,QQ都使用了这样的导航菜单,我们也了解下:

  Android Design 的流行趋势:Navigation Drawer 导航抽屉

参考这篇文章:http://www.geekpark.net/topics/183724

效果图:

                 

特点

  1.标题栏(或者actionBar) 做的有个 菜单图标按钮(三条线或者其他)。一般这样的标题栏左侧和右侧都会有图标按钮。如图1所示。

  2.点击图标按钮 从左侧向右 慢慢退出一个 菜单视图(View),遮盖在 内容页(首页)的视图上,同时,产生遮盖层。如图2所示。

怎么实现?

  官方示例

    参考自谷歌开发者网站的示例,在这个页面可以下载到示例。http://developer.android.com/training/implementing-navigation/nav-drawer.html

  引用类库

    需要android-support-v4.jar

  主要控件

    谷歌提供的抽屉控件: android.support.v4.widget.DrawerLayout

    参考这片文章的解释:http://blog.csdn.net/xiahao86/article/details/8995827

具体实现

  首页(比如叫:MainActivity)内容布局,写一个 android.support.v4.widget.DrawerLayout,它需要包含两个内容视图元素,第一个视图元素是 主显示内容页,第二个是要抽屉弹出的视图。

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" > <!--
As the main content view, the view below consumes the entire
space available using match_parent in both dimensions.
--> <FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" /> <!--
android:layout_gravity="start" tells DrawerLayout to treat
this as a sliding drawer on the left side for left-to-right
languages and on the right side for right-to-left languages.
The drawer is given a fixed width in dp and extends the full height of
the container. A solid background is used for contrast
with the content view.
--> <zyf.demo.navigationdrawer.NavigationMenu
android:id="@+id/navigation_menu"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start" >
</zyf.demo.navigationdrawer.NavigationMenu> </android.support.v4.widget.DrawerLayout>

我在这里写了个自定义控件 “ zyf.demo.navigationdrawer.NavigationMenu " ,注意它的 android:layout_gravity="start" ,是 start 不是left。

MainActivity需要获得为DrawerLayout 注册一个回调事件接口ActionBarDrawerToggle ,这个事件的实现者监听器会获得 抽屉弹出(onDrawerOpened)和关闭(onDrawerClosed)的事件。

MainActivity 的代码

package zyf.demo.navigationdrawer;

import android.os.Bundle;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.res.Configuration;
import android.graphics.drawable.ColorDrawable;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast; public class MainActivity extends Activity {
private NavigationMenu mNavigationMenu;
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 获得抽屉控件
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
// 获得菜单控件
mNavigationMenu = (NavigationMenu) findViewById(R.id.navigation_menu);
mNavigationMenu.attacthDrawer(mDrawerLayout); // enable ActionBar app icon to behave as action to toggle nav
// drawer
getActionBar().setDisplayHomeAsUpEnabled(true);
// 使actionbar 的logo图标透明不可见
getActionBar().setIcon(
new ColorDrawable(getResources().getColor(
android.R.color.transparent))); // 注册导航菜单抽屉 的弹出和关闭事件
mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */
mDrawerLayout, /* DrawerLayout object */
R.drawable.ic_notification_content, /*
* nav drawer image to replace 'Up'
* caret
*/
R.string.drawer_open, /* "open drawer" description for accessibility */
R.string.drawer_close /* "close drawer" description for accessibility */
) {
// 当导航菜单抽屉 关闭后
public void onDrawerClosed(View view) {
// 显示当前内容页的标题
getActionBar().setTitle(getTitle());
invalidateOptionsMenu(); // creates call to
// onPrepareOptionsMenu()
} // 当导航菜单抽屉 打开后
public void onDrawerOpened(View drawerView) {
// 显示导航菜单的标题
getActionBar().setTitle(mNavigationMenu.getTitle());
invalidateOptionsMenu(); // creates call to
// onPrepareOptionsMenu()
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle); // 显示首页的内容
showFragment(new HomeFragment()); // 当更换主页内的 子页面(fragment)时,隐藏导航菜单
mNavigationMenu.hide();
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
} /* Called whenever we call invalidateOptionsMenu() */
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// If the nav drawer is open, hide action items related to the content
// view
// 当弹出导航菜单时,使 actionbar的扩展按钮不可见
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mNavigationMenu);
menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);
return super.onPrepareOptionsMenu(menu);
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// The action bar home/up action should open or close the drawer.
// ActionBarDrawerToggle will take care of this.
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
// Handle action buttons
switch (item.getItemId()) {
case R.id.action_websearch:
Toast.makeText(this, "你点击了搜索按钮", Toast.LENGTH_LONG).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
} private void showFragment(Fragment fragment) {
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment).commit();
} @Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
} @Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggls
mDrawerToggle.onConfigurationChanged(newConfig);
} }

下面给出我写的自定义控件的实现:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <ListView
android:id="@+id/listView1"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice" android:background="#FFFFFF"/>
</RelativeLayout>
package zyf.demo.navigationdrawer;

import android.content.Context;
import android.support.v4.widget.DrawerLayout;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.Toast; public class NavigationMenu extends RelativeLayout {
LayoutInflater mLayoutInflater;
ListView mlistView1;
String[] menuItemsDataSource;
private DrawerLayout mDrawerLayout;// 关联到的抽屉控件 public NavigationMenu(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initLayout(context);
} public NavigationMenu(Context context, AttributeSet attrs) {
super(context, attrs);
initLayout(context);
} public NavigationMenu(Context context) {
super(context);
initLayout(context);
} private void initLayout(Context context) {
mLayoutInflater = LayoutInflater.from(context);
View contentView = mLayoutInflater.inflate(R.layout.navigation_menu,
null);
RelativeLayout.LayoutParams lp = new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
this.addView(contentView, lp); mlistView1 = (ListView) contentView.findViewById(R.id.listView1);
menuItemsDataSource = getResources().getStringArray(
R.array.navigation_menu_items_array); mlistView1.setAdapter(new ArrayAdapter<String>(context,
R.layout.navaigation_menu_list_view_item, menuItemsDataSource));
mlistView1.setOnItemClickListener(new DrawerItemClickListener());
} /**
* 包含 的 listView的点击事件
* @author yunfei
*
*/
private class DrawerItemClickListener implements
ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// selectItem(position); mlistView1.setItemChecked(position, true);
hide(); Toast.makeText(getContext(), "你选择了" + position, 0).show();
}
} public CharSequence getTitle() {
return "导航菜单";
} /**
* 关联到 drawerLayout
* @param drawerLayout
*/
public void attacthDrawer(DrawerLayout drawerLayout) {
mDrawerLayout = drawerLayout;
} /**
* 隐藏
*/
public void hide() {
if (mDrawerLayout != null)
mDrawerLayout.closeDrawer(NavigationMenu.this);
} /**
* 出现
*/
public void show() {
if (mDrawerLayout != null)
mDrawerLayout.openDrawer(NavigationMenu.this);
} }

代码下载: http://yunpan.cn/cggiDkFNCp2Jw 访问密码 c3ed

参考:

http://blog.csdn.net/xiahao86/article/details/8995827
http://developer.android.com/training/implementing-navigation/nav-drawer.html
http://www.geekpark.net/topics/183724

  

  

android开发(38) 使用 DrawerLayou t实现左侧抽屉式导航菜单的更多相关文章

  1. Android开发技巧——使用Dialog实现仿QQ的ActionSheet菜单

    最近看到有人用Dialog来实现QQ的仿ActionSheet的自定义菜单,对于自己没实现过的一些控件,看着也想实现一下.于是动手了一下,发现也不难,和大家分享一下. 本文原创,转载请注明出处:htt ...

  2. android 开发 修改系统背景(状态栏颜色、导航栏颜色、标题栏颜色等等)

    1.打开values下的styles.xml 发现有以下代码: <resources> <!-- Base application theme. --> <style n ...

  3. Java与Android开发环境配置以及遇到的问题解决

    0 概述 所有文章涉及的下载地址在文章下方会有汇总,所有软件的版本最好与系统版本一致 建议安装安卓开发软件至一个目录中,以方便查找 1 Java环境配置 1.1 JDK下载: 据说JDK6用的比较多, ...

  4. Android开发技巧——实现可复用的ActionSheet菜单

    在上一篇<Android开发技巧--使用Dialog实现仿QQ的ActionSheet菜单>中,讲了这种菜单的实现过程,接下来将把它改成一个可复用的控件库. 本文原创,转载请注明出处: h ...

  5. 【转】Android开发笔记(序)写在前面的目录

    原文:http://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经 ...

  6. Ubuntu 配置 Android 开发 环境

    . 果断换Ubuntu了, Ubuntu的截图效果不好, 不能设置阴影 ... 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article ...

  7. [置顶] Android开发笔记(成长轨迹)

    分类: 开发学习笔记2013-06-21 09:44 26043人阅读 评论(5) 收藏 Android开发笔记 1.控制台输出:called unimplemented OpenGL ES API ...

  8. [译]:Xamarin.Android开发入门——Hello,Android快速上手

    返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...

  9. Android开发环境搭建(jdk+eclip+android sdk)

    在开启Android 开发之旅之前,首先要把准备工作做好---搭建开发环境 一.环境搭建: 1.Java JDK 安装 2.Eclipse 安装 3.Android SDK 安装 4.ADT安装 5. ...

随机推荐

  1. 转 MySQL问题排查工具介绍

    原文链接: http://mrchenatu.com/2017/03/24/mysql-tool/ 本总结来自美团内部分享,屏蔽了内部数据与工具 知识准备 索引 索引是存储引擎用于快速找到记录的一种数 ...

  2. SNF.Net 快速开发平台Spring.Net.Framework 诞生的由来与规划

    没有快速开发平台的时候只能感慨自己曾经浪费了那么多精力在拖拽控件上,总写重复的代码,却花了很多精力且不能体现自己的价值.SNF快速开发平台能把你解放出来,让你有更多的时间参与到核心业务逻辑中去,让你有 ...

  3. 关于jquery 取值,赋值常用控件的问题

    一.文本框 对于单个文本框: 1.获取文本框: $("#id").val() 2.赋值: $("#id").val("赋值"); 或 (清空 ...

  4. Android:相机适配及图片处理的一些问题

    链接:http://www.cnblogs.com/liushilin/p/6387263.html 链接:http://www.cnblogs.com/liushilin/p/5956691.htm ...

  5. wget常见用法

    1.很多软件官网会有安装脚本,并把脚本搞成raw模式,方便下载后直接运行的shell文件.比如docker wget -qO- get.docker.com | bash -q的含义是:--quiet ...

  6. 基于SSD固态硬盘的数据库性能优化

    基于SSD固态硬盘的数据库性能优化 2010-11-08 00:0051cto佚名   关键字:固态硬盘 数据库管理 SSD 企业软件热点文章 Java内存结构与模型结构分析 Oracle触发器的语法 ...

  7. 腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动

    在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH ...

  8. Atitit 项目管理 提升开发效率的项目流程方法模型 哑铃型  橄榄型 直板型

    Atitit 项目管理 提升开发效率的项目流程方法模型 哑铃型  橄榄型 直板型 项目主体三个部分 ui界面,中间层,数据库 按照不同的比重可以分为一下三个模型  哑铃型  橄榄型 直板型 哑铃型 开 ...

  9. Java Web(六) EL表达式

    这也是属于JSP范围内的知识,使用EL表达式,能更好的使用JSP中的各种内置对象和作用域,说点闲话,马上要出去实习了,有点恐慌,可能这是马上要出去工作的学生的通病,继续努力把,兵来将挡水来土掩, -- ...

  10. [svc]nginx限制客户端上传附件的大小

    300 行 python 代码的轻量级 HTTPServer 实现文件上传下载 系统环境 [root@n1 conf]# cat /etc/redhat-release CentOS Linux re ...