Android 用 DrawerLayout 和 NavigationView 实现侧滑菜单栏

Android 侧滑菜单的实现(NavigationView) 很早之前就像写个android的侧滑菜单加入到项目中了,但是很多给的都是密密麻麻的代码,今天看到了简单快速的实现方法:通过NavigationView+DrawLayout来实现侧滑菜单的功能。Google I/O 2015 给大家带来了AndroidDesign Support Library,对于希望做md风格的app的来说,简直是天大的喜讯.NavigationView是是Google 阅读详情

       这是我们 Material Design 系列的第三篇文章了,今天我们来谈谈侧滑菜单,侧滑菜单是很多 APP 中常见的功能效果,今天我们将介绍使用 Material Design 中的 DrawerLayout 和 NavigationView 相结合来实现侧滑栏菜单效果,借助 Google 提供的这些工具实现侧滑的功能将变得异常的简单,侧滑菜单可以将菜单选项隐藏起来,然后可以通过滑动的方式来显示,这样很好的节省了手机屏膜的空间,这也是 Material Design 设计中非常推荐的做法,例如谷歌邮箱 Gmail 就使用了这种设计,接下来我们就来具体的实现这种非常常见的效果,我们先来上效果图吧





下面我们来看一下实现如上界面的布局代码:


<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout

    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawerLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#c7c6c6">

    <RelativeLayout
        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="@color/colorPrimary"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:titleTextColor="#f5f0f0" />

    </RelativeLayout>


    <android.support.design.widget.NavigationView
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        app:headerLayout="@layout/navigation_head"
        app:menu="@menu/navigation">

    </android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>

       其实很简单,我们看到最外层是一个 DrawerLayout 控件,是由 suppout-v4 库提供的,首先它是一个布局,在布局中容许放置两个直接的子控件,第一个子控件是主屏幕中显示的内容,第二个子控件是滑动菜单中显示的内容


       我们这里放了两个子控件:一个相对布局,然后放置了我们上一次分享的 ToolBar 控件,另一个子控件这里使用了一个NavigationView,其实这里放什么都可以,DrawerLayout 并没有限制使用固定的控件,这里需要注意的是,关于第二个控件,layout_gravity 这个属性是必须制定的,因为我们要告诉 DrawerLayout 滑动菜单是在屏膜的左边还是右边

  • left 表示滑动菜单在左边
  • right 表示滑动菜单在右边
  • start 表示会根据系统语言进行判断
这里我们指定了left,从屏膜左边滑出

       想必到这里大家该问第二个控件为什么是使用 NavigationView 了,接下来我们来简单介绍下 NavigationView,事实上,你可以在滑动菜单页面自己定制任意的布局,但是谷歌给我们提供了一种更好的方法,那就是使用 NavigationView,NavigationView 也是 Design Support 库中提供的一个控件,是严格按照 Material Design 风格来设计的,使我们实现滑动菜单页面更加的简单,下面我们就来介绍如何使用 NavigationView

首先需要在 app/build.gradle 文件中引入 Design Support 库:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.1.0'
    testCompile 'junit:junit:4.12'

    compile 'com.android.support:design:25.1.0'
}


然后在使用 NavigationView 之前我们还需要准备两个东西:menu 和 headerLayout,menu 是用来在 NavigationView 中显示具体的菜单项的,headerLayout 是用来在 NavigationView 中显示头布局的

然后我们在 menu 文件夹中创建 navigation 文件,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="single">

        <item
            android:id="@+id/account"
            android:icon="@mipmap/account"
            android:title="account" />
        <item
            android:id="@+id/attachment"
            android:icon="@mipmap/attachment"
            android:title="attachment" />
        <item
            android:id="@+id/edit"
            android:icon="@mipmap/edit"
            android:title="edit" />
        <item
            android:id="@+id/set"
            android:icon="@mipmap/set"
            android:title="set" />
    </group>
</menu>

      我们首先在 <menu> 中嵌套了一个 <group> 标签,然后将 group 中的 checkableBehavior 属性指定为 single,group 表示一个组,checkableBehavior 指定为 single 表示组中所有菜单项只能单选,这里我们定义了 4 个 item,里面的属性想必我就不用一一介绍了,现在我们就把 menu 准备好了,接下来我们来 headerLayout,这里我们要在 layout 文件夹中创建 navigation_head 文件,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="160dp"
    android:background="#7dd1f0"
    android:gravity="center"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="head layout"
        android:textSize="40dp" />
</LinearLayout>


         这个布局非常简单,就不具体介绍了,这样 headerLayout 布局文件我们就创建好了,然后再通过如下两行代码把我们准备好的 menu 和 headerLayou 设置进去:

app:headerLayout="@layout/navigation_head"
app:menu="@menu/navigation">


到这里我们的 NavigationView 就设置完成了

接下来我们去完善 MainActivity 中的代码如下:

       为了让用户知道屏膜的边缘是可以拖动的,MD 的做法是建议在 ToolBar 的最左侧加入一个导航按钮,点击按钮也会将滑动菜单的内容展示出来,下面我们来实现这个功能,首先我们准备了一张 category.png 图标,放在 mipmap 目录下,然后修改 MainActivity 中的代码如下:

/**
 * NavigationView 侧滑栏
 */
public class MainActivity extends AppCompatActivity {

    private DrawerLayout mDrawerLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolBar);
        setSupportActionBar(toolbar);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);

        ActionBar actionBar = getSupportActionBar();
        if (actionBar!=null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setHomeAsUpIndicator(R.mipmap.category);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.toolbar, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

            case R.id.backup:
                Toast.makeText(this, "Click Backup", Toast.LENGTH_LONG).show();
                break;
            case R.id.delete:
                Toast.makeText(this, "Click Delete", Toast.LENGTH_LONG).show();
                break;
            case R.id.setting:
                Toast.makeText(this, "Click Setting", Toast.LENGTH_LONG).show();
                break;

            case android.R.id.home:
                mDrawerLayout.openDrawer(Gravity.LEFT);
                break;
            default:
        }
        return true;
    }
}

       这里我们首先调用 findViewById() 方法得到了 DrawerLayout 的实例,然后调用 getSupportActionBar() 方法得到了 ActionBar 的实例,这个 ActionBar 的具体体现是由 ToolBar 来实现的,接着调用 ActionBar 的 setDisplayHomeAsUpEnabled() 方法让导航按钮显示出来,又调用 setHomeAsUpIndicator() 方法来设置一个导航按钮图标,接下来我们在 onOptionsItemSelected() 方法中对导航按钮进行点击事件的处理,导航按钮的 id 永远都是 android.R.id.home,然后调用 DrawerLayout 的 openDrawer() 方法将滑动菜单展示出来,注意这里 openDrawer() 方法要求传入一个 Gravity 参数,这里我们保持和 xml 中的一致,传入 Gravity.LEFT

接下来我们需要去处理 NavigationView 中菜单项的点击事件了,接着修改 MainActivity 中的代码如下:

/**
 * NavigationView 侧滑栏
 */
public class MainActivity extends AppCompatActivity {

    private DrawerLayout mDrawerLayout;

    private NavigationView navigationView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolBar);
        setSupportActionBar(toolbar);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);

        navigationView = (NavigationView) findViewById(R.id.navigation);

        ActionBar actionBar = getSupportActionBar();
        if (actionBar!=null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setHomeAsUpIndicator(R.mipmap.category);
        }

        navigationView.setCheckedItem(R.id.account);
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                mDrawerLayout.closeDrawers();

                //do something

                return true;
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.toolbar, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

            case R.id.backup:
                Toast.makeText(this, "Click Backup", Toast.LENGTH_LONG).show();
                break;
            case R.id.delete:
                Toast.makeText(this, "Click Delete", Toast.LENGTH_LONG).show();
                break;
            case R.id.setting:
                Toast.makeText(this, "Click Setting", Toast.LENGTH_LONG).show();
                break;

            case android.R.id.home:
                mDrawerLayout.openDrawer(Gravity.LEFT);
                break;
            default:
        }
        return true;
    }
}
       
      代码比较简单,这里我们同上还是先获取到 NavigationView 的实例,然后调用它的 setCheckedItem() 方法将 account 菜单项来设置为默认选项,接着调用了 setNavigationItemSelectedListener() 方法来设置一个菜单项中的事件监听器,当用户点击任意菜单项时,会回调 onNavigationItemSelected() 方法,我们可以在这个方法中写相应的逻辑,具体内容还需要大家自己完成,这里调用了closeDrawers() 方法将滑动菜单关闭

好了到这里就介绍完了,如有错误请指出

 源码地址:点击打开链接



Android应用开发中的侧滑菜单栏 本文介绍了如何在Android应用中创建一个具有侧滑菜单栏的界面。在Android应用开发中,侧滑菜单栏是一种常见的用户界面设计模式,它可以提供方便的导航和功能选项。本文将介绍如何在Android应用中创建一个具有侧滑菜单栏的界面,并提供相应的源代码。注意:以上代码是基于support包的旧版API,如果你使用的是最新版的AndroidX库,则需要相应地修改引入的包和代码,以适配最新的Android开发规范。通过上述代码,我们实现了一个具有侧滑菜单栏的Android界面。 阅读详情

相关推荐

手把手教你为RK3588开发板适配RTL8211F网卡:设备树配置与PHY驱动匹配全流程

本文详细介绍了在RK3588开发板上适配RTL8211F千兆以太网PHY芯片的全流程,包括硬件原理图确认、设备树配置与PHY驱动匹配。通过实战案例和调试技巧,帮助开发者解决常见问题并优化网络性能,适用于嵌入式Linux开发中的Ethernet网络功能实现。

weixin_29184075的博客 526

Android——DrawerLayout滑动范围的设置

最近做项目的时候需要用到DrawerLayout做侧边栏,当然自己也可以通过用ViewDragHelper来实现侧边栏优点是可高度定制化,但是比较繁琐。而DrawerLayout是系统封装好的控件,用起来简单。DrawerLayout本身内部也会通过ViewDragHelper 实现的。言归正传,系统自带的DrawLayout只能实现从屏幕边缘滑出菜单,现在需求是全屏幕任何位置都能滑出。有两种方法可

a591193965的博客 1万+

深度学习的卷积神经网络的煤矸石识别

在本博文中,我们提出了一种基于深度学习的煤矸石检测与识别系统,该系统采用YOLOv8算法对煤矸石进行检测和识别,实现对图片中的煤矸石进行准确识别。1.项目需求对煤矸石进行检测与识别,系统将识别出图片中的克服小块煤矸石漏检的缺陷。 2.项目实现 通过调研,本项目最终使用yolov8模型作为目标检测的模型, YOLOv8 旨在快速、准确且易使用,使其成为广泛的物体检测、图像分割和图像分类任务的极佳选择。 1.数据集:格式为jpg的3091张煤矸石图片2.YOLOv8环境配置yolo检测网络包括24个卷积层

2201_75355700的博客 792

ViewDragHelper解析

概要 ViewDragHelper是谷歌在2013年的I/O大会上推出的一个用于View拖拽操作的帮助类,借助于该类谷歌同时推出了两个用于侧滑的布局SlidingPaneLayout和DrawerLayout,现在市场上的很多带有侧滑菜单的应用都是基于这两种布局。 ViewDragHelper极大的简化了View的拖拽操作,在它没有出现之前很多侧滑都是采用的第三方库,为了实现侧滑效果需

hyb1234hi的专栏 341

从理想光源到部分相干:Abbe与Hopkins模型在计算光刻中的演进与选择

本文深入探讨了计算光刻中Abbe模型与Hopkins模型的演进与选择,分析了理想光源与部分相干光源在光刻仿真中的关键差异。Abbe模型基于理想点光源假设,计算简洁但存在精度局限;Hopkins模型则通过互强度函数和TCC技术,更准确地模拟现实中的部分相干光源,尤其适用于先进节点光刻工艺。文章还提供了模型选择的实用建议,帮助工程师在精度与效率间取得平衡。

weixin_29217235的博客 298

PLC1200使用CB1241RS485通讯模块做从站进行Modbus Rtu通信

添加新设备(PLC)->设备和网络管理->点击PLC->看到硬件目录选择通信板->点到点->CB1241(RS485)->看到6ES7241-1CH30-1XB0选择添加,如图。指向Modbus保持寄存器数据块的指针 我这里指向了自定义的DB块数据中一个INT数组。在通信->通信处理模块->MODBUS(选择不带RTU的通信指令块)注意:接线时,TRA接485调试模块的B- TRB接调试模块的A+组态后的硬件标识符 270 对应自己组态后自动生成的。1:事务完成,且无任何错误。波特率对应自己使用的。

swmyaopeng的博客 2万+

Android抽屉动画-----DrawerLayout的简单使用

文章目录一、简介二、修改布局文件三、添加主界面和侧滑界面四、控制侧滑界面的状态五、为侧滑界面添加事件监听器六、侧滑界面上控件的响应事件 一、简介 DrawerLayout 是 Google 推出的一款能够实现侧滑效果的控件,可以实现如同网易云音乐的左侧菜单效果。实现简单,且提供了很多操作方法,可满足日常的使用。由于 AndroidX 已替代 support 使用,故 DrawerLayout 类目前位于 androidx.drawerlayout.widget 包下。 官方文档:https://develo

m0_47761892的博客 1640

利用Sigrity的SPEED2000进行时域电源噪声分析

SPEED2000进行时域电源噪声分析

ZHENGSA的博客 3620

Android关于BottomNavigationView使用指南

BottomNavigationView

QG 5820

三极管和MOS管工作原理详解

PN结的形成 PN结是三极管以及场效应管中最基本的组成部分,要想彻底搞明白三极管以及场效应管的工作原理,必须先搞清楚PN结形成的原理和工作特性。 本征半导体以及空穴对 本征半导体(intrinsic semiconductor))完全不含杂质且无晶格缺陷的纯净半导体称为本征半导体。主要常见代表有硅、锗这两种元素的单晶体结构。硅、锗都是4价原子,在半导体内部形成相对稳定的共价键结构,如图 1所

技术交流是便宜的的博客 10万+

回归预测 | MATLAB实现基于贝叶斯线性回归(Bayesian Regression)的多变量输入回归预测

回归预测 | MATLAB实现基于贝叶斯线性回归(Bayesian Regression)的多变量输入回归预测

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 2199

MaterialDesign之NavigationView和DrawerLayout实现侧滑菜单栏

本文将介绍使用Google最新推出规范式设计中的NavigationView和DrawerLayout结合实现侧滑菜单栏效果,NavigationView是android-support-design包下的一个控件,该包下还有AppBarLayout、CoordinatorLayout、FloatingActionButton、SnackBar、TabLayout、TextInputLayout等

琦琦的博客 1459

苹果生态最佳搭档:Mac mini + OpenClaw + iPhone 远程控制

本文详细介绍如何通过iPhone远程控制Mac mini上的OpenClaw应用,打造高效苹果生态工作流。内容包括:1) 苹果生态整合优势,包括AirDrop、Handoff等功能对比;2) Mac mini配置步骤,涵盖SSH/VNC设置、网络优化及Docker部署OpenClaw;3) iPhone端SSH/VNC客户端选择与Tailscale内网穿透配置;4) 详细SSH密钥设置与连接测试方法。通过这套方案,用户可实现跨设备无缝控制OpenClaw应用,提升远程工作效率。(149字)

一键难忘的博客 793

Material Design控件使用(二)

本文介绍如何使用DrawerLayout和NavigationView实现侧滑菜单栏的效果。

阳春面的专栏 750

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android NavigationDrawer(侧滑导航栏 DrawerLayout + NavigationView)

Android NavigationDrawer(侧滑导航栏 DrawerLayout + NavigationView) Google官方出品的侧滑导航栏, 可替换长期未维护的SlidingMenu. 除此之外, 还有个第三方开源库MaterialDrawer可供选择 Navigation Drawer 是 Material Design 中的侧滑导航栏, 由抽屉布局 DrawerLayou...

Luzhuo 的博客 6881

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Material Design之NavigationView和DrawerLayout实现侧滑菜单栏

本文将介绍使用Google最新推出规范式设计中的NavigationView和DrawerLayout结合实现侧滑菜单栏效果,NavigationView是android-support-design包下的一个控件,该包下还有AppBarLayout、CoordinatorLayout、FloatingActionButton、SnackBar、TabLayout控件,也是Google在Andro

【博客地址迁移到】:https://zhengxiaoyong.com 7058

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【Android】侧滑菜单栏功能的实现(类似于QQ)

通过NavigationView+DrawerLayout来实现侧滑菜单的功能(效果图如上),可通过点击左上角图标以及向右滑动实现侧滑菜单,类似于QQ侧滑菜单。

大帅Douk的博客 8966

android开发:使用DrawerLayout仿快手侧滑菜单栏

先看对比一下我们写的效果和别人的效果: activity的xml布局: <?xml version="1.0" encoding="utf-8"?> <androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/and...

一个程序员-二白的博客 1549

Android之使用DrawerLayout+NavigationView+ToolBar实现抽屉侧滑菜单

一:将DrawerLayout设为根布局 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas....

yuncaidaishu的博客 537

android侧滑加二级菜单栏,Android中DrawerLayout实现侧滑菜单效果

众所周知,android里面我们很熟悉的一个功能,侧滑菜单效果在以前我们大部分都是用的slidingmenu这个开源框架,自从谷歌官方新出的一个DrawerLayout控件之后,越来越多的应用开始使用谷歌的官方的控件写这个效果了。话不多说,先来发图以表我滴诚意:开始写代码DrawerLayout 是v4包里面的,所以项目里面需要添加v4包,具体怎么添加就不多说了,NavigationView需要在...

weixin_32252533的博客 535

DrawerLayout和Fragment做出侧滑效果

废话不多说,先上图片效果(亲测有效) <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/a

MorganYang的专栏 3566

android侧滑菜单栏DrawerLayout的使用

android侧滑菜单栏DrawerLayout的使用

weixin_47062100的博客 2902

MaterialDesign之NavigationView和DrawerLayout实现侧滑菜单栏(抽屉)

DrawerLayout可以实现左滑和右滑功能,只要在layout文件中配置好左右两个抽屉就可以了,左右两个抽屉可以是任意的view,结合NavigationView可以很好实现侧滑菜单的功能 要使用DrawerLayout,需要v4包,使用NavigationView,需要v7包 实例: xmlns:android="http://schemas.android.com/apk

手指乐 4659

NavigationView和DrawerLayout实现侧滑菜单栏

android高级之NavigationView和DrawerLayout实现侧滑菜单栏(抽屉)

program008的博客 757

Material Design 侧滑菜单栏

NavigationView和DrawerLayout结合实现侧滑菜单栏效果,NavigationView是android-support-design包下的一个控件.如果要在XML使用NavigationView的app:headerLayout和app:menu属性,需要在build.gradle中添加compile 'com.android.support:design:23.4.0'。

xiexuan2007的专栏 2060

android模仿快手作品界面,android开发:使用DrawerLayout仿快手侧滑菜单栏

先看对比一下我们写的效果和别人的效果:activity的xml布局:1.根部局是DrawerLayout布局,必须设置openDrawer属性:tools:openDrawer="start"这个属性决定你的菜单是左边滑出还是右边2.侧滑菜单是NavigationView布局app:headerLayout="@layout/nav_header_main" 侧滑菜单的头部app:menu="@m...

weixin_39816260的博客 889
上一篇: Android ToolBar 完全解析
下一篇: Android 用 TabLayout + ViewPager + Fragment 实现顶部、底部导航栏
QDJdeveloper
博客等级 码龄11年 108粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值