• 首先看一下效果吧

Android Design Support Library中增加了 NavigationView与DrawerLayout这个控件。代替SlidingMenu项目中的使用!

在这里让我们来学习一下DrawerLayout和NavigationView的使用吧!

  • 在工程中添加依赖:

     compile 'com.android.support:design:25.0.0'
    

在Material Design中,NavigationView导航与DrawerLayout抽屉,被设计用于应用导航,提供了一种通用的导航方式,体现了设计的一致性。

NavigationView是一个导航菜单框架,使用menu资源填充数据,使我们可以更简单高效的实现导航菜单。

  • 在XML中使用DrawerLayout与NavigationView进行布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="cn.hnshangyu.navigationview.MainActivity"><android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"android:layout_width="match_parent"android:layout_height="match_parent"><!--主页面--><FrameLayout
            android:id="@+id/fl_main"android:background="@color/colorAccent"android:layout_width="match_parent"android:layout_height="match_parent" /><!--侧滑页--><android.support.design.widget.NavigationView
            android:id="@+id/navigation"android:layout_width="320dp"android:layout_height="match_parent"android:layout_gravity="start"app:headerLayout="@layout/drawer_header"app:menu="@menu/drawer" /></android.support.v4.widget.DrawerLayout>
</RelativeLayout>

注意其中NavigationView的两个自定义属性
app:headerLayout接收一个layout,作为导航菜单顶部的Header,即效果图中的侧滑页图片部分,开发中设置则有,不设置则无。
app:menu接收一个menu,作为导航菜单的菜单项,几乎是必选项,不然这个控件就失去意义了。但也可以在运行时动态改变menu属性。

用于NavigationView的典型menu文件,应该是一个可选中菜单项的集合。其中checked=”true”的item将会高亮显示,这可以确保用户知道当前选中的菜单项是哪个。

  • 侧滑页头布局drawer_header中的布局
<?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"><ImageView
        android:layout_width="match_parent"android:layout_height="match_parent"android:src="@mipmap/ic_recyclerview_09" />
</RelativeLayout>

在这里只设置了一张图片,在这里其实有个疑惑,也是注意的地方,就是头布局在Activity中怎么得到并设置点击事件等操作呢?稍后看代码!

  • menu/drawer的布局
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"tools:context=".MainActivity"><group android:checkableBehavior="single"><item
            android:id="@+id/navigation_item_one"android:icon="@mipmap/wsxx"android:title="huangixoaguo" /><item
            android:id="@+id/navigation_item_two"android:icon="@mipmap/wddd"android:title="目录" /><item
            android:id="@+id/navigation_item_three"android:icon="@mipmap/wdyd"android:title="佳佳" /><item
            android:id="@+id/navigation_item_four"android:icon="@mipmap/wdyy"android:title="闹钟" /><item
            android:id="@+id/navigation_item_five"android:icon="@mipmap/sz"android:title="设置" /><item
            android:id="@+id/navigation_subheader_one"android:icon="@mipmap/sz"android:title="子条目"><menu><item
                    android:id="@+id/navigation_sub_item_one"android:icon="@mipmap/wdyd"android:title="佳佳" /><item
                    android:id="@+id/navigation_sub_item_two"android:icon="@mipmap/wdyy"android:title="闹钟" /></menu></item><item
            android:id="@+id/navigation_subheader_two"android:icon="@mipmap/sz"android:title="子条目"><menu><item
                    android:id="@+id/navigation_sub_item_four"android:icon="@mipmap/wdyd"android:title="佳佳" /><item
                    android:id="@+id/navigation_sub_item_five"android:icon="@mipmap/wdyy"android:title="闹钟" /></menu></item><item
            android:id="@+id/navigation_subheader_three"android:icon="@mipmap/sz"android:title="子条目"><menu><item
                    android:id="@+id/navigation_sub_item_six"android:icon="@mipmap/wdyd"android:title="佳佳" /><item
                    android:id="@+id/navigation_sub_item_seven"android:icon="@mipmap/wdyy"android:title="闹钟" /></menu></item><item
            android:id="@+id/navigation_subheader_four"android:icon="@mipmap/sz"android:title="子条目"><menu><item
                    android:id="@+id/navigation_sub_item_eight"android:icon="@mipmap/wdyd"android:title="佳佳" /><item
                    android:id="@+id/navigation_sub_item_nine"android:icon="@mipmap/wdyy"android:title="闹钟" /></menu></item></group>
</menu>

里面使用menu的嵌套,来显示分组子标题!

  • Activity中的操作
package cn.hnshangyu.navigationview;import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.NavigationView;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.RelativeLayout;import butterknife.Bind;
import butterknife.ButterKnife;
import cn.hnshangyu.navigationview.utils.UIUtils;public class MainActivity extends AppCompatActivity {@Bind(R.id.fl_main)FrameLayout flMain;@Bind(R.id.navigation)NavigationView mNavigationView;@Bind(R.id.drawer_layout)DrawerLayout mDrawerLayout;private RelativeLayout headerView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButterKnife.bind(this);//得到头布局headerView = (RelativeLayout) mNavigationView.getHeaderView(0);initListener();}private MenuItem lastItem;private void initListener() {mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {@Overridepublic boolean onNavigationItemSelected(@NonNull MenuItem item) {switch (item.getItemId()) {case R.id.navigation_item_one:break;case R.id.navigation_item_two:break;case R.id.navigation_item_three:break;case R.id.navigation_item_four:break;case R.id.navigation_sub_item_one:break;case R.id.navigation_sub_item_two:break;case R.id.navigation_sub_item_four:break;case R.id.navigation_sub_item_five:break;case R.id.navigation_sub_item_six:break;case R.id.navigation_sub_item_seven:break;case R.id.navigation_sub_item_eight:break;case R.id.navigation_sub_item_nine:break;case R.id.navigation_item_five:break;}if (lastItem != null) {lastItem.setChecked(false);}item.setChecked(true);lastItem = item;UIUtils.showToast(item.getTitle().toString());mDrawerLayout.closeDrawers();return false;}});headerView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {UIUtils.showToast("头像");mDrawerLayout.closeDrawers();}});}
}

用setNavigationItemSelectedListener方法来设置当导航项被点击时的回调。OnNavigationItemSelectedListener会提供给我们被选中的MenuItem,这与Activity的onOptionsItemSelected非常类似。通过这个回调方法,我们可以处理点击事件,改变item的选中状态,更新页面内容,关闭导航菜单,以及任何我们需要的操作。

其中的到headview的方法在这里我使用的是: navigationView.getHeaderView(0)的方式,如果子view较多

 headerView = navigationView.getHeaderView(0);headImg = (ImageButton)headerView.findViewById(R.id.user_head_img);userName = (TextView) headerView.findViewById(R.id.user_name);userDescription = (TextView) headerView.findViewById(R.id.user_description);   

这种方式可以得到子view。

或:

先在Activity中声明NavigationView,然后再通过View view = NavigationView.inflateHeaderView(int LayoutResID)这个方法导入头部布局文件,这就意味着在NavigationView中不会静态去设置app:header属性,并且获取了头部的View,这样就可以通过View.findId...()方法来定位和监听了。

好了,差不多到这里基本的使用方法就实现了!有不好的地方,欢迎大家指出….谢谢!!!

Demo下载:http://download.csdn.net/detail/huangxiaoguo1/9742204

android新特性:DrawerLayout与NavigationView配合使用相关推荐

  1. Android进阶之光读书笔记——第一章:Android新特性

    第一章 Android新特性 主要讲了一些Android 5.0.6.0.7.0新特性 1.1 Android 5.0新特性 Android 5.0 Lollipop是2014年10月发布的,那时候我 ...

  2. [Android 新特性] 有史来最大改变 Android 5.0十大新特性

    距离Android系统上一次重大更新不到一年的时间,谷歌再一次从KitKat升级到了Lollipop,而两次都使用糖果来命名,营销的目的显露无 遗.当我们首次看到Android 5.0 Lollipo ...

  3. 移动周刊第 177 期:Android 新特性介绍、iOS 客户端框架演进

    写在前面 本期移动周刊第 177 期如约而至,聚焦 Android.iOS.VR/AR/MR.直播等前沿移动开发技术,收录一周最热点,解读开发技巧,我们希望从中能够让你有一些收获,如果你有好的文章以及 ...

  4. 【转】 Android新特性介绍,ConstraintLayout完全解析

    转自:http://blog.csdn.net/guolin_blog/article/details/53122387 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关 ...

  5. android 新特性笔记

    此篇文章,只作为个人笔记之用 Android 9.0 新特性 链接:https://baijiahao.baidu.com/s?id=1610506662242386397&wfr=spide ...

  6. Android开发之DrawerLayout与NavigationView之间不得不说的基友情

    前言:话说自从5.0之后,Google为了安卓应用的风格更加统一(之前是holo风格,不过引起的反响不大),开始了Matrail Design的设计风格,咱今天所讲的就是基于Matrail Desig ...

  7. Android新特性介绍,ConstraintLayout完全解析

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/53122387 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭 ...

  8. android付款功能,Qpay,利用 Android 新特性,把所有付款方式放在一起 | App+1

    应用快捷方式(App Shortcuts)是 Android 7.1 引入的众多新特性之一,利用这一特性,我们只需长按应用图标,即可通过在弹出的快捷方式列表进行操作.这一特性类似 iOS 设备上的 3 ...

  9. Android 新特性 看这篇就够了

    Android 9.0版本 新功能 Android 9.0的新功能包括:谷歌统一推送升级.深度集成Project Treble模式.更加封闭.原生支持通话录音等. 1.全面屏的全面支持 [5] 2.通 ...

最新文章

  1. 干掉前端!3分钟纯 Java 注解搭个管理系统,我直接好家伙
  2. python网页模板_python-找不到HTML模板
  3. JavaScript 要点(十四)HTML DOM 元素(节点)
  4. DM9000 寄存器的定义
  5. Electron学习-创建一个程序
  6. boost::mpl模块实现transform相关的测试程序
  7. 在基于图论的Java程序中基于DSL的输入图数据的方法
  8. verilog 除法器
  9. 数据之光 · 安全未来 | 第四届中国数据安全治理高峰论坛圆满召开!
  10. Windows核心编程_在Visual Studio窗口输出调试信息
  11. R语言大作业(四):上海市、东京 1997-2018 年GDP值分析
  12. 淘客APP开发定制系统推荐
  13. 使用husky + lint-staged助力团队编码规范
  14. WFA程序C#窗体间传值
  15. beautifulsoup菜鸟教程
  16. 最近经常看到网上程序员被抓,如何避免面向监狱编程!?
  17. 战地4如何修改服务器,战地4如何修改服务器地址
  18. 拯救者Y9000P 加装固态
  19. Windows7启动用AHCI模式,进系统时蓝屏?
  20. 设置随机种子的函数: srand(种子);的重要性

热门文章

  1. linux6.5退出文档,Centos6.5及Linux基础命令和基础知识点笔记!6.25更新
  2. alpha冲刺(事后诸葛亮)
  3. 可可西里观后感(转)-保护藏羚羊
  4. 如何制作电视展示艺术品(或全家福)
  5. (java编程)输出1000以内的所有质数
  6. 电商生鲜网站开发(三)——后台开发:商品分类模块-Redis/Swagger/统一身份校验/IDEA技巧
  7. 下一代互联网:三网融合下的美丽画卷
  8. Mac安装升级solc编译器
  9. 计算机科学家的名言警句,有关写数学的名言警句
  10. “大数据金融”亟待“大数据安全”