AndroidP NavigationView

Access denied | www.programcreek.com used Cloudflare to restrict access
Please enable cookies.
What happened?
The owner of this website (www.programcreek.com) has banned your access based on your browser's signature (41a4d45f9c186dde-ua98).DrawerLayout和NavigationView使用详解 - 简书
DrawerLayout和NavigationView使用详解
Android Material Design Library 推出了很长时间,越来越多的APP使用了符合Library 包的控件,DrawerLayout绝对是热门之一,Material Design定义了一个抽屉导航应该有何种外观和感受,统一了侧滑菜单和样式。在Android原生手机上对DrawerLayout+NavigationView更是使用到了极致,如Gmail,Google Map
关于DrawerLayout和NavigationView的使用介绍博客有很多,这里主要是实现一些使用上的介绍,如让NavigationView在Toolbar下方,不显示Toolbar左侧按钮等。
下面开始看下DrawerLayout的如何使用,首先在build.gradle中引入Design包
compile 'com.android.support:design:24.2.1'
(一)、基本使用
新建一个Activity,这里我们选择使用Android Studio提供的模板,选择NavgationDrawer Activity
QQ截图54.jpg
查看下界面的xml文件
&?xml version="1.0" encoding="utf-8"?&
&android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start"&
layout="@layout/app_bar_drawer_layout__one"
android:layout_width="match_parent"
android:layout_height="match_parent"/&
&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"
app:headerLayout="@layout/nav_header_drawer_layout__one"
app:menu="@menu/activity_drawer_layout__one_drawer"/&
&/android.support.v4.widget.DrawerLayout&
可以看到我们的最外层是DrawerLayout,包含了两个内容:include为显示内容区域,NavigationView为侧边抽屉栏。
NavigationView有两个app属性,分别为app:headerLayout和app:menu,eaderLayout用于显示头部的布局(可选),menu用于建立MenuItem选项的菜单。
headerLayout就是正常的layout布局文件,我们查看下menu.xml
&?xml version="1.0" encoding="utf-8"?&
&menu xmlns:android="http://schemas.android.com/apk/res/android"&
&group android:checkableBehavior="single"&
android:id="@+id/nav_camera"
android:icon="@drawable/ic_menu_camera"
android:title="Import"/&
android:id="@+id/nav_gallery"
android:icon="@drawable/ic_menu_gallery"
android:title="Gallery"/&
android:id="@+id/nav_slideshow"
android:icon="@drawable/ic_menu_slideshow"
android:title="Slideshow"/&
android:id="@+id/nav_manage"
android:icon="@drawable/ic_menu_manage"
android:title="Tools"/&
&item android:title="Communicate"&
android:id="@+id/nav_share"
android:icon="@drawable/ic_menu_share"
android:title="Share"/&
android:id="@+id/nav_send"
android:icon="@drawable/ic_menu_send"
android:title="Send"/&
menu可以分组,group的android:checkableBehavior属性设置为single可以设置该组为单选
Activity主题必须设置先这两个属性
&style name="AppTheme.NoActionBar"&
&item name="windowActionBar"&false&/item&
&item name="windowNoTitle"&true&/item&
未设置Activity主题会爆出错误信息:
vCaused by: java.lang.IllegalStateException: This Activity
already has an action bar supplied by the window decor.
Do not request Window.FEATURE_SUPPORT_ACTION_BAR
and set windowActionBar to false in your theme to use a Toolbar instead.
设置主题为android:theme="@style/AppTheme.NoActionBar"
最后java代码
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
(二)、监听和关闭NavigationView
NavigationView监听通过navigationView.setNavigationItemSelectedListener(this)方法去监听menu的点击事件
@SuppressWarnings("StatementWithEmptyBody")
public boolean onNavigationItemSelected(MenuItem item)
// Handle navigation view item clicks here.
int id = item.getItemId();
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
每次点击一个Menu关闭DrawerLayout,方法为drawer.closeDrawer(GravityCompat.START);
通过onBackPressed方法,当点击返回按钮的时候,如果DrawerLayout是打开状态则关闭
public void onBackPressed()
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
super.onBackPressed();
(三)、NavigationView在Toolbar下方
大多数的APP都是使用NavigationView都是全屏的,当我们想让NavigationView在Toolbar下方的时候应该怎么做呢
xml布局如下图,DrawerLayout在Toolbar的下方
&LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/sample_main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"&
&android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:theme="@style/ThemeOverlay.AppCompat.Dark" /&
&android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"&
&FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" &
android:padding="16dp"
android:text="NavigationView在Toolbar下方"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="match_parent" /&
&/FrameLayout&
&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"
app:headerLayout="@layout/nav_header_drawer_layout_one"
app:menu="@menu/activity_drawer_layout_one_drawer"/&
&/android.support.v4.widget.DrawerLayout&
&/LinearLayout&
NavigationView在Toolbar下方.gif
(四)、Toolbar上不显示Home旋转开关按钮
上图可以看到我们点击Home旋转开关按钮,显示和隐藏了侧滑菜单。那么如果我们想要不通过按钮点击,只能右划拉出菜单需要怎么做呢。
我们先看下带Home旋转开关按钮的代码是如何写的:
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
//这是带Home旋转开关按钮
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer,
R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
这个Home旋转开关按钮实际上是通过ActionBarDrawerToggle代码绑定到toolbar上的,ActionBarDrawerToggle是和DrawerLayout搭配使用的,它可以改变android.R.id.home返回图标,监听drawer的显示和隐藏。ActionBarDrawerToggle的syncState()方法会和Toolbar关联,将图标放入到Toolbar上。
进入ActionBarDrawerToggle构造器可以看到一个不传Toolbar参数的构造器
public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout,
@StringRes int openDrawerContentDescRes,
@StringRes int closeDrawerContentDescRes) {
this(activity, null, drawerLayout, null, openDrawerContentDescRes,
closeDrawerContentDescRes);
那么不带Home旋转开关按钮的代码如下
//这是不带Home旋转开关按钮
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer,
R.string.navigation_drawer_open, R.string.navigation_drawer_close);
当然我们把上面带Home旋转开关按钮的代码删除也是可以的。
Toolbar上不显示Home旋转开关按钮.gif
(五)、不使用NavigationView,使用DrawerLayout+其他布局
APP实际开发中往往不能完全按照Materialdesign的规则来,如网易云音乐的侧滑,底部还有两个按钮。这时候我们可以通过+其他布局来实现特殊的侧滑布局。
我们可以参考鸿杨大神的博客
我们自己实现个简单的,DrawerLayout包裹了一个FrameLayout和一个RelativeLayout,FrameLayout是我们的显示内容区域,RelativeLayout是我们的侧边栏布局。
&android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start"&
&FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"&
&android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/&
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:padding="16dp"
android:text="@string/title_activity_drawer_layout_other"/&
&/FrameLayout&
&RelativeLayout
android:id="@+id/nav_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@android:color/white"
android:fitsSystemWindows="true"&
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="这是顶部按钮"/&
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="这是中间的按钮"/&
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="这是底部按钮"/&
&/RelativeLayout&
&/android.support.v4.widget.DrawerLayout&
如果需要监听DrawerLayout的侧滑状态监听,那么代码如下:
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
* 也可以使用DrawerListener的子类SimpleDrawerListener,
* 或者是ActionBarDrawerToggle这个子类
mDrawerLayout.setDrawerListener(new DrawerLayout.SimpleDrawerListener() {
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
效果图如下:
DrawerLayout+其他布局.gif
最后上github地址
Android程序员
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
1. Toolbar 1.使用Toolbar,首先需要将系统的ActionBar隐藏,打开res/values/styles.xml文件,修改AppTheme的parent为Theme.AppCompat.Light.NoActionBar(淡色主题),或者Theme.Ap...
1、Toolbar 1.1 修改样式##### 首先要知道,任何一个新建项目默认都是ActionBar,这个ActionBar就是根据项目中指定的主题来显示,打开AndroidManifest.xml文件看一下,如下所示: 可以看到,这里使用 android:theme属性...
内容抽屉菜单ListViewWebViewSwitchButton按钮点赞按钮进度条TabLayout图标下拉刷新ViewPager图表(Chart)菜单(Menu)浮动菜单对话框空白页滑动删除手势操作RecyclerViewCardColorDrawableSpinner...
#记梦#今天凌晨的梦真是颇具传奇色彩 内容主要围绕着一名名叫傅青叶的女生(她实际的名字叫傅爱媛,妈妈起的名字)起源于二十年前一桩悬案。一名带着小孩的妇女失踪,据推测是被杀害,可惜下落不明,她的孩子尚在襁褓之中。实际上妇女是被两个青年所杀,这两个青年受当时电影的影响杀了这这名...
用汪峰的《生来彷徨》开头吧。每天走在疯狂逐梦大街上,我们精神褴褛却毫无倦意……高考一场散伙饭便把我们分到了祖国的大江南北。而会成为想念的你们,一个在重庆,一个在攀枝花。我不知道生活的轨迹是怎样的,我也不知道我和你们是否在沿着规定的轨道行走。朋友啊,曾经以为的大学,那个神圣的...
我将结局拾起 每一页的痕迹 述说着每一场戏剧 末页的华丽 脱离现实主义 完全活在虚拟 撕碎的页数 一针一针地缝补 却刺透了伤处 持续累积的痛楚 麻痹了双目 迷茫
看不清楚 掉落的纸 布满密密麻麻的字 并非我故意丢失 因为经历的增殖 使其脱离支持 逐渐被无视 时间的沉淀 净...
孩子都是父母的复印件,所以当复印件出了问题,那问题的根源在哪里? 在这本书里,有一句话甚至是恐怖的,“孩子就是父母的监视器”,作为父母,也许我们对世界已经麻木了、疲惫了,但孩子对这个世界充满了好奇,他同样会细致入微地观察我们。所以自己的缺陷很容易被孩子记住,并且模仿。 想要...新人专享好礼凡未购买过小册的用户,均可领取三张 5 折新人专享券,购买小册时自动使用专享券,最高可节省 45 元。小册新人 5 折券最高可省 15 元小册新人 5 折券最高可省 15 元小册新人 5 折券最高可省 15 元注:专享券的使用期限在领券的七天内。一键领取购买小册时自动使用专享券前往小册首页本活动仅适用于小册新用户知道了Android BottomNavigationView,底部导航栏的简单实现关于 Material Design 相关的控件,之前整理了一个系列文章,并在 GitHub 上建立一个
工程,使用代码和文字解说配合的方式逐一说明。截止目前,大致写有八九篇文章。期间,由于一些工作变动和琐事,停了一些时间。现在,有点时间,准备续上。
之前的文章,参考列表如下:
这一篇要说的是 Android App 中的 BottomNavigation 设计,底部导航栏,设计规范可参考官网:
support.design 包中对应提供的控件是 BottomNavigationView,提供不多于 5 个菜单的底部导航栏实现。
我们先来看一下基本使用:
android:id="@+id/bnv_menu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:itemIconTint="@color/selector_blue"
app:itemTextColor="@color/selector_blue"
app:menu="@menu/menu_bottom_navigation"/&使用 menu 资源定义菜单内容,也就是这里的 res/menu/menu_bottom_navigation.xml 文件:
&?xml version="1.0" encoding="utf-8"?&
xmlns:android="http://schemas.android.com/apk/res/android"&
android:id="@+id/action_home"
android:title="Home"
android:icon="@drawable/ic_action_home"/&
android:id="@+id/action_explore"
android:title="Explore"
android:icon="@drawable/ic_action_explore"/&
android:id="@+id/action_me"
android:title="Me"
android:icon="@drawable/ic_action_me"/&
&除了 app:menu 属性定义菜单内容,BottomNavigationView 能够使用的定制属性并不多,有这几个:
app:itemIconTint:Icon 图标着色,值为一个 ColorStateList ,可以在 color 资源文件夹中定义。使用这个属性,奇妙利用 tint 着色器实现一个图标多种状态下使用。:
&?xml version="1.0" encoding="utf-8"?&
xmlns:android="http://schemas.android.com/apk/res/android"&
android:state_checked="true" android:color="@color/blue"&&
android:color="@color/gray"&&
&app:itemTextColor:Label 文字颜色定义。
app:itemBackground:背景内容。
效果如下:
上图是 3 个菜单时的展示和交互方式,即菜单文字和图标同时显示,选中时有一个大小变化过程(这里不是动画,通过源码可以看到,其实只是一个简单的尺寸上的瞬时缩放)。但是,当超过 3 个菜单时,文字就不再显示。对比看一下 5 个菜单时的效果图:
可以看到,交互方式也发生变化,选中有一个左右移动腾出空间的过程。那再多一点菜单数量,比如 6 个时呢?对不起,要报错啦,不支持!
注意:根据 Material Design 对底部导航栏的设计要求,BottomNavigationView 只支持 3 到 5 个子菜单数量的导航栏。并且,考虑到用户体验,3 个及3个以下菜单数量的导航栏,与超过 3 个时,交互过程也有所区分。关于最多支持 5 个字菜单的内容,可以从 BottomNavigationView 源码中查看:public static final int MAX_ITEM_COUNT = 5;当超出这个数量时,产生非法参数异常。
通过 setOnNavigationItemSelectedListener() 方法可以监听不同子菜单的选中切换事件。但是,竟然没有一个简便的方法直接设置选中某个子菜单,就像 check(id) 这样。不知是不是 BottomNavigationView 控件设计时的遗漏。目前能够想到的一个做法就是获取 menu item 对象,利用 performClick() 模拟点击事件,如:
BottomNavigationView view = (BottomNavigationView) findViewById(R.id.bnv_menu);
view.findViewById(R.id.action_explore).performClick();以上便是 BottomNavigationView 的所有内容,按照 Android 上的 Bottom Navigation 设计规范定制而成。可以看出,使用起来还是很简单的。同时,可定制性也非常有限。比如,想在底部某个子菜单添加一个小红点提示的视图,就有些难以处理。如果使用 RadioGroup 实现导航栏的话,就灵活一些。
附:GitHub 站有一个
开源项目,专门针对 Material Design 风格的 Bottom Navigation 量身定制的,可供参考。
关于我:亦枫,博客地址:,新浪微博:
微信扫描二维码,欢迎关注我的个人公众号:安卓笔记侠
不仅分享我的原创技术文章,还有程序员的职场遐想
加入掘金和开发者一起成长。发送简历到 hr@xitu.io,期待你的加入!分享Android中NavigationView的使用与相关问题解决
转载 & & 投稿:daisy
大家都知道NavigationView的引入让 Android侧边栏实现起来相当方便,最近公司项目中也使用这个新的控件完成了侧边栏的改版。在使用过程中遇到一些问题所以记录一下。本文分为两个部分,一是基本使用,二是相关问题的解决,感兴趣的朋友们下面来一起看看吧。
一、基本使用
1. NavigationView 在 design 库中,添加依赖(最新的是 23.2.0);
compile 'com.android.support:design:23.1.1'
2. 然后在 DrawerLayout 布局中添加 NavigationView ;
&?xml version="1.0" encoding="utf-8"?&
&android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"&
&FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"&
&LinearLayout
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"&
&android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/&
&/LinearLayout&
&/FrameLayout&
&android.support.design.widget.NavigationView
android:id="@+id/navigation"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/nav_header"
app:menu="@menu/activity_main_drawer"/&
&/android.support.v4.widget.DrawerLayout&
其中需要注意给 NavigationView 设置 android:layout_gravity="start" 属性。
3.然后注意到 NavigationView 其实是分两个部分的,一个是头部,一个是下面的菜单列表部分
如下图所示:
其中头部通过 app:headerLayout="@layout/nav_header" 属性添加,nav_header 的布局如下:
&?xml version="1.0" encoding="utf-8"?&
&FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="192dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark"&
&ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/nav_header_bg"
android:scaleType="centerCrop"/&
&ImageView
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_gravity="bottom"
android:layout_marginBottom="36dp"
android:padding="8dp"
android:src="@drawable/ic_avatar"/&
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:padding="16dp"
android:text="Jaeger"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"/&
&/FrameLayout&
下面的菜单列表部分是一个 menu 文件,通过 app:menu="@menu/activity_main_drawer"属性添加。
activity_main_drawer.xml 文件在 menu 文件夹下,内容为:
&?xml version="1.0" encoding="utf-8"?&
&menu xmlns:android="http://schemas.android.com/apk/res/android"&
&group android:checkableBehavior="single"&
android:id="@+id/nav_camera"
android:icon="@drawable/ic_menu_camera"
android:title="Import"/&
android:id="@+id/nav_gallery"
android:icon="@drawable/ic_menu_gallery"
android:title="Gallery"/&
android:id="@+id/nav_slideshow"
android:icon="@drawable/ic_menu_slideshow"
android:title="Slideshow"/&
android:id="@+id/nav_manage"
android:icon="@drawable/ic_menu_manage"
android:title="Tools"/&
&item android:title="Communicate"&
android:id="@+id/nav_share"
android:icon="@drawable/ic_menu_share"
android:title="Share"/&
android:id="@+id/nav_send"
android:icon="@drawable/ic_menu_send"
android:title="Send"/&
4. 菜单列表的点击事件
菜单列表的点击事件设置代码如下:
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
public boolean onNavigationItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.nav_personal_info:
// do something
至此,NavigationView 的基本使用就差不多搞定了,效果就是前面图片显示的效果。
以下是使用过程中遇到的问题及解决方式。
一、菜单图标颜色被渲染成其他颜色
NavigationView默认会按照 Android 设计规范,将菜单里的图标渲染成itemIconTint所设置的颜色。如果你没有设置这个属性,则会渲染成它默认的深灰色。如果不想图标颜色被渲染,可通过以下代码解决:
navigationView.setItemIconTintList(null);
二、菜单图标与文字的间距过大
NavigationView的菜单中,图标与文字的间距为32dp,但是通常与我们的设计师出的效果不同,这时可以通过重写以下属性来进行设置:
&dimen name="design_navigation_icon_padding" tools:override="true"&16dp&/dimen&
以上就是这篇文章的全部内容了,希望本文的内容对各位Android开发者们能有所帮助,如果有疑问大家可以留言交流。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 AndroidView旋转 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信