DrawerLayoutMenu使用详解

如今许多APP都在使用DrawerLayout抽屉式菜单,Material Design统一了侧滑式菜单和样式,重新定义了一个抽屉式导航应该有的外观和感受。关于DrawerLayout,这里主要对其使用进行介绍。

在应用或模块的 build.gradle 文件中添加所需工件的依赖项:

dependencies {implementation "androidx.drawerlayout:drawerlayout:1.0.0"}

MainActivity.java

DrawerLayout.DrawerListener:监听器用于监控有关抽屉的事件,例如菜单展开是更新actionbar菜单等等,以下为基本方法:
1.onDrawerSlide: 菜单滑动时调用
2.onDrawerOpened: 打开菜单时调用
3.onDrawerClosed: 关闭菜单时调用
4.onDrawerStateChanged: 菜单状态改变时调用

package com.dalong.drawlayoutmenu;import android.content.Context;
import android.os.Bundle;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Display;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;public class MainActivity extends AppCompatActivityimplements NavigationView.OnNavigationItemSelectedListener {private CoordinatorLayout right;private NavigationView left;private boolean isDrawer=false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);setSupportActionBar(toolbar);FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);fab.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG).setAction("Action", null).show();}});DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);right = (CoordinatorLayout) findViewById(R.id.right);left = (NavigationView) findViewById(R.id.nav_view);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);right.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {if(isDrawer){return left.dispatchTouchEvent(motionEvent);}else{return false;}}});drawer.setDrawerListener(new DrawerLayout.DrawerListener() {@Overridepublic void onDrawerSlide(View drawerView, float slideOffset) {isDrawer=true;//获取屏幕的宽高WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);Display display = manager.getDefaultDisplay();//设置右面的布局位置  根据左面菜单的right作为右面布局的left   左面的right+屏幕的宽度(或者right的宽度这里是相等的)为右面布局的rightright.layout(left.getRight(), 0, left.getRight() + display.getWidth(), display.getHeight());}@Overridepublic void onDrawerOpened(View drawerView) {}@Overridepublic void onDrawerClosed(View drawerView) {isDrawer=false;}@Overridepublic void onDrawerStateChanged(int newState) {}});}@Overridepublic void onBackPressed() {DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);if (drawer.isDrawerOpen(GravityCompat.START)) {drawer.closeDrawer(GravityCompat.START);} else {super.onBackPressed();}}@SuppressWarnings("StatementWithEmptyBody")@Overridepublic boolean onNavigationItemSelected(MenuItem item) {// Handle navigation view item clicks here.int id = item.getItemId();if (id == R.id.nav_camera) {// Handle the camera action} else if (id == R.id.nav_gallery) {} else if (id == R.id.nav_slideshow) {} else if (id == R.id.nav_manage) {} else if (id == R.id.nav_share) {} else if (id == R.id.nav_send) {}DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);drawer.closeDrawer(GravityCompat.START);return true;}
}

抽屉式菜单主要由主页和侧滑菜单页面组成,以下为activity_main.xml和activity_main_drawer.xml

activity_main.xml
DrawerLayout里面有两个元素:
1.include:用于显示页面内容
2.NavigationView:侧滑菜单,其中有两个属性headerLayout和menu,分别用于显示顶部布局和构建MenuItem选项菜单

<?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"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/drawer_layout"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"tools:openDrawer="start"><includelayout="@layout/app_bar_main"android:layout_width="match_parent"android:layout_height="match_parent" /><android.support.design.widget.NavigationViewandroid: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_main"app:menu="@menu/activity_main_drawer" /></android.support.v4.widget.DrawerLayout>

activity_main_drawer.xml
menu可以进行分组,group的android:checkableBehavior属性设置为single可以设置该组为单选

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><group android:checkableBehavior="single"><itemandroid:id="@+id/nav_camera"android:icon="@drawable/ic_menu_camera"android:title="import" /><itemandroid:id="@+id/nav_gallery"android:icon="@drawable/ic_menu_gallery"android:title="Gallery" /><itemandroid:id="@+id/nav_slideshow"android:icon="@drawable/ic_menu_slideshow"android:title="Slideshow" /><itemandroid:id="@+id/nav_manage"android:icon="@drawable/ic_menu_manage"android:title="Tools" /></group><item android:title="Communicate"><menu><itemandroid:id="@+id/nav_share"android:icon="@drawable/ic_menu_share"android:title="Share" /><itemandroid:id="@+id/nav_send"android:icon="@drawable/ic_menu_send"android:title="Send" /></menu></item></menu>

运行结果

作者:潘聪
原文链接:https://blog.csdn.net/nopnopnopnop/article/details/106739532

DrawerLayoutMenu使用详解相关推荐

  1. 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)

    首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...

  2. JVM年轻代,老年代,永久代详解​​​​​​​

    秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...

  3. docker常用命令详解

    docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...

  4. 通俗易懂word2vec详解词嵌入-深度学习

    https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...

  5. 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法

    深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...

  6. CUDA之nvidia-smi命令详解---gpu

    nvidia-smi是用来查看GPU使用情况的.我常用这个命令判断哪几块GPU空闲,但是最近的GPU使用状态让我很困惑,于是把nvidia-smi命令显示的GPU使用表中各个内容的具体含义解释一下. ...

  7. Bert代码详解(一)重点详细

    这是bert的pytorch版本(与tensorflow一样的,这个更简单些,这个看懂了,tf也能看懂),地址:https://github.com/huggingface/pytorch-pretr ...

  8. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  9. pytorch nn.LSTM()参数详解

    输入数据格式: input(seq_len, batch, input_size) h0(num_layers * num_directions, batch, hidden_size) c0(num ...

  10. Java集合详解之Map

    一.首先看看集合框架体系图 从图中可以看到,Map接口扩展了Iterator接口,关于Iterator接口详解请移步:Iterator接口详解 二.Map是什么? Map<k,v>使用键值 ...

最新文章

  1. 逆向-攻防世界-maze
  2. 读文献先读图——主成分分析 PCA 图
  3. FPGA配置模式(Altera版)
  4. 图解数据库辅助软件教程
  5. 基于FAST-RCNN深度学习的目标识别算法的MATLAB仿真
  6. license 验证服务器唯一机器码_代码审计工具Fortify 17.10及Mac平台license版本
  7. b树范围查找_使用段树查找最大查询范围
  8. java 求集合真子集_【每日打卡】新高一数学必修打卡第二天教学视频—集合的基本运算...
  9. 如何升级mysql-libs_MySQL升级教程(CentOS)
  10. 如何安装Python3.7,小白必看!
  11. html表单提交数据保存到mysql中_php – Canonical:如何将HTML表单数据保存到MySQL数据库中...
  12. python递归函数分叉树枝_python递归函数绘制分形树的方法
  13. 80286计算机配置,电脑的各种配置给详的细解释.doc
  14. matlab 正弦信号合成三角波,【matlab求助】正弦波叠加成三角波信号
  15. 网页制作中的超链接怎么做
  16. react 组件 进阶之 ref (ts 版本)
  17. 河南省普通高中学业水平测试计算机,河南省普通高中信息技术学业水平测试综合测试题3(有答案)...
  18. React中文文档 7. 条件渲染
  19. 广受青睐的题材---蒸汽朋克[Steampunk](转)
  20. 读书笔记-精准努力-思考时间和精力的分配

热门文章

  1. linux运行igv报错,远程linux IGV桌面显示(putty+xming+xmanager)-Go语言中文社区
  2. 3.多边形曲线简化之Douglas-Peucker算法
  3. vue根据获取的文件名显示文件服务器上的图片
  4. [LOJ#6198]谢特[后缀数组+trie+并查集]
  5. 3分钟教你如何用代码向心爱的女生表白
  6. Android 手机获取Mac地址的方法
  7. STM32CubeMX全部版本下载地址
  8. STM32——用固件库实现流水灯(源码+仿真图)
  9. “零踩线”的越秀地产真的美好吗?
  10. 表达矩阵melt之后 画图 reshape gaochao ards 1: Unknown or uninitialised column: `p`. 2: Computation failed i