导航抽屉(navigationdrawer)是一个从屏幕左边滑入的面板,用于显示应用的主要导航项目。用户可以通过在屏幕左边缘滑入或者触摸操作栏的应用图标打开导航抽屉。导航抽屉覆盖在内容之上,但不覆盖操作栏。当导航抽屉完全打开后,操作栏的标题需要更换为应用的名称,而不是显示当前视图的名称,并且关闭所有和当前视图相关的操作按钮。操作栏的“更多操作”菜单按钮不需要关闭,以保证用户可以随时访问“设置”和“帮助”。下面我们就来实现导航抽屉的功能。

Layout布局文件代码

<android.support.v4.widget.DrawerLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/drawer_layout"android:layout_width="match_parent"android:layout_height="match_parent"><!-- The main content view --><FrameLayoutandroid:id="@+id/content_frame"android:layout_width="match_parent"android:layout_height="match_parent" /><!-- The navigation drawer --><ListView android:id="@+id/left_drawer"android:layout_width="100dp"android:layout_height="match_parent"android:layout_gravity="start"android:choiceMode="singleChoice"android:dividerHeight="1dp"android:background="#ffffff"/>
</android.support.v4.widget.DrawerLayout>

注意要点:

(1)主要视图(上述FrameLayout)必须为DrawerLayout中的第一个孩子,因为XML意味着z顺序和抽屉必须的内容。  

(2)主要内容视图必须设置为匹配父视图的宽度和高度,因为它代表整个UI导航抽屉时隐藏。  

(3)抽屉视图(上述ListView)必须指定它的水平重力与android:layout_gravity属性。支持从右到左的语言(RTL),指定值与“开始”而不是“左”(右边的抽屉里出 现时,布局是RTL)。   

(4)抽屉视图指定宽度的dp单位和父视图的高度匹配。抽屉的宽度应不超过320 dp所以用户总是可以看到部分的主要内容。

(5)DrawerLayout必须成为布局的根节点

MainActivity的代码

package com.example.g07_navigationdrawer;import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.os.Bundle;import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;public class MainActivity extends Activity {private String[] mPlanetTitles; // listView的每一个item的名字private DrawerLayout mDrawerLayout;private ListView mDrawerList;private ActionBarDrawerToggle mDrawerToggle; // 用来监听DrawerLayout事件@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mPlanetTitles = getResources().getStringArray(R.array.planets_array);mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);mDrawerList = (ListView) findViewById(R.id.left_drawer);// 为ListView添加适配器mDrawerList.setAdapter((ListAdapter) new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, mPlanetTitles));// 监听ListView的点击事件mDrawerList.setOnItemClickListener(new DrawerItemClickListener());mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);// 监听DrawerLayout的监听事件mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,R.drawable.ic_launcher, R.string.app_name, R.string.app_name) {public void onDrawerClosed(View view) {super.onDrawerClosed(view);Toast.makeText(MainActivity.this, "抽屉关闭了", Toast.LENGTH_SHORT).show();}public void onDrawerOpened(View drawerView) {super.onDrawerOpened(drawerView);Toast.makeText(MainActivity.this, "抽屉打开了", Toast.LENGTH_SHORT).show();}};mDrawerLayout.setDrawerListener(mDrawerToggle);}private class DrawerItemClickListener implementsListView.OnItemClickListener {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {// 根据ListView的被选中的选项切换界面布局Fragment fragment = new Fragment();FragmentManager fragmentManager = getFragmentManager();fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();mDrawerList.setItemChecked(position, true);// 给操作栏设置标题getActionBar().setTitle(mPlanetTitles[position]);mDrawerLayout.closeDrawer(mDrawerList);}}
}

Android开发之Navigationdrawer导航抽屉功能的实现(源代码分享)相关推荐

  1. Android开发之Serializable 和 Parcelable的区别(源代码分享)

    android 中自定义的对象序列化的问题有两个选择一个是Parcelable,另外一个是Serializable. 一 序列化原因: 1.永久性保存对象,保存对象的字节序列到本地文件中: 2.通过序 ...

  2. Android开发之Service与Activity数据交互(源代码分享)

    Service想要与Activity进行数据交互,首先Activity先得绑定Service.bound service是service 的实现,它允许其他应用程序绑定到它并与之交互.要提供bound ...

  3. Android 开发之 QQ变声功能实现

    1.简介 在QQ中我们使用到的一个功能就是变声,QQ是使用FMOD实现的,那么同样的我们也使用FMOD让自己的应用可以变音 2.FMOD简介 fmod Ex 声音系统是为游戏开发者准备的革命性音频引擎 ...

  4. Android studio实现底部导航,Android 开发之BottomBar+ViewPager+Fragment实现炫酷的底部导航效果...

    BottomBar BottomBar是Github上的一个开源框架,因为从1.3.3开始不支持fragments了,要自己配置,弄了很久,不管是app的fragment还是V4 的程序总是总是闪退. ...

  5. Android监听作用,Android开发之CheckBox的简单使用与监听功能示例

    本文实例讲述了Android开发之CheckBox的简单使用与监听功能.分享给大家供大家参考,具体如下: activity_main.xml android:layout_width="ma ...

  6. android 图库分析,Android开发之ImageSwitcher相册功能实例分析

    本文实例讲述了Android开发之ImageSwitcher相册功能.分享给大家供大家参考,具体如下: 简介: 1.ImageSwitcher是viewSwitcher的子类,所以ImageSwitc ...

  7. Android开发之旅:android架构

    引言 通过前面两篇: Android 开发之旅:环境搭建及HelloWorld Android 开发之旅:HelloWorld项目的目录结构 我 们对android有了个大致的了解,知道如何搭建and ...

  8. Android开发之TextView高级应用

    Android开发之TextView高级应用 我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此.以下就和大家分享一下TextView的一些使用技巧. A ...

  9. android之json解析优化,Android开发之json解析

    目前正在尝试着写app,发现看懂代码和能写出来差距很大,最关键的是java基础比较的差,因为只会python,java基础只学习了一个礼拜就过了.感觉java写出来的代码不如python简单明了. 上 ...

最新文章

  1. C# 笔记 .net与C#简单说明
  2. 安卓tinyalsa源码,可使用makefile直接编译
  3. 如何增加儿童产品中的趣味性?
  4. ACL 2016 | Modeling Coverage for Neural Machine Translation
  5. 搭建nfs共享存储服务之二nfs服务端配置
  6. UVA - 202 Repeating Decimals
  7. 【java】java 并发编程 Condition 源码分析
  8. qt msvc编译中文乱码解决
  9. win7下u盘安装ubuntu组成双系统
  10. MSN:常见故障“步步通”(转)
  11. qnap威联通作文件服务器,QNAP 威联通 TS-453A NAS存储服务器 开箱初体验
  12. 数学建模常用算法案例k—means聚类分析
  13. 计算机课程教学质量分析,课程教学质量分析报告.PDF
  14. ac8265网卡linux驱动,【奋威AC8265笔记本无线网卡使用总结】安装|驱动|任务管理器_摘要频道_什么值得买...
  15. kicad最小布线宽度默认是多少_常见停车场管理系统项目的安装布线及注意事项...
  16. 2022年春招美团二面总结 凉经
  17. oracle db、dba和rdba
  18. unity3d发布webgl手机测试流程
  19. 量子计算(1)量子力学基本理论(上)
  20. 如何利用手机翻译软件进行中文翻译英语

热门文章

  1. python矩阵reshape_[LeetCode Python3]566. Reshape the Matrix(重塑矩阵)
  2. 浙江大学计算机考研大纲,2018年浙江大学研究生入学考试《计算机学科专业基础》(878)考试大纲...
  3. java rect offset_Rect 的相关操作
  4. python argparse库_python标准库之argparse
  5. linux查询数据库sql,SQL Server 跨数据库查询
  6. 财务python招聘_会计、财务、HR等重复性质岗位学习python有什么帮助?
  7. MySQL报错解决方案:2013-Lost connection to MySQL server
  8. Mac 终端便利工具: 管理工具-Homebrew 和提示工具oh my zsh
  9. Linux 中文件管理常用的工具
  10. 如何使用ember下拉框组件??