新手必看:Android studio 侧边栏实现,带源码

news2024/11/24 19:00:04

文章目录

  • 前言
  • 效果图
  • 正文
    • toolbar 用于定义应用程序的导航栏
    • app_bar
    • drawer_layout 用于创建侧边栏导航
      • nav_header_draw
    • app:menu="@menu/activity_main_drawer"

前言

本篇内容主要是自己实现侧边栏后的一些总结,部分理论来着网络和ai助手,如有错误,欢迎大佬指点

效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

正文

我刚开始没有找到很合适新手的实例,所有我尝试了Android studio自带侧边栏的布局
在这里插入图片描述
但是使用过后,我发现他有一些东西是我不想要的,我就把我不要的东西删掉,保留我想要的,我的侧边栏是全局侧边栏,就做了一个侧边栏activity来复用,多个fragment复用一个侧边栏activity,目前看到比较多的也就是这种形式实现全局侧边栏了,如果和我刚开始一样,对侧边栏没有任何基础的情况下可以试下我的方法或者看我这篇博客,这篇博客将会讲出我所知道的全局侧边栏的实现方法

我用的是NavigationView实现的,在用NavigationView实现时发现侧边栏主要包含这些部分的内容,接下来我们就一个个部分来讲
在这里插入图片描述

toolbar 用于定义应用程序的导航栏

这个xml主要作用是定义了一个侧边栏布局,其中包含一个Toolbar作为应用的主标题栏,以及一个AppBarLayout为这个栏提供了背景和行为
AppBarLayout 用于组合一个或多个应用程序栏,并且可以为这些栏提供背景和行为
Toolbar 可以作为应用的主标题栏,并包含一组菜单项和自定义操作

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="wrap_content"
    tools:context=".DrawerActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/Theme.MyMall.AppBarOverlay">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/Theme.MyMall.PopupOverlay" />

    </com.google.android.material.appbar.AppBarLayout>
</LinearLayout>

app_bar

这段代码定义了一个具有侧边栏的布局,侧边栏中包含一个工具条,而内容区域则是一个可以滚动的帧布局
<androidx.coordinatorlayout.widget.CoordinatorLayout>是Android的一个布局,它可以协调在其内部的其他各种布局和视图的行为,例如AppBarLayout和Scrolling UI组件
这个xml中引入了tool_bar.xm
<LinearLayout>中还有一个<FrameLayout>元素,它的滚动行为设置为@string/appbar_scrolling_view_behavior。这个滚动行为使得当这个视图(FrameLayout)滚动时,AppBarLayout会跟着滚动

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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"
    tools:context=".DrawerActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <include
            layout="@layout/tool_bar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <FrameLayout
            android:id="@+id/flContent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

drawer_layout 用于创建侧边栏导航

这个xml是连接activity的,使用了<androidx.drawerlayout.widget.DrawerLayout>布局,用于创建侧边栏导航
android:fitsSystemWindows="true":这个属性指示该布局会填充系统窗口,通常用于创建全屏体验。
tools:openDrawer="start":这是在工具栏中打开侧边栏的指示。

xml中有NavigationView和一个include

  • NavigationView用于创建侧边栏的导航视图,其中包含:
    app:headerLayout="@layout/nav_header_draw"指定导航视图的头部布局
    app:menu="@menu/activity_main_drawer" 指定导航视图的菜单资源
    android:layout_gravity="start":属性指定了导航视图应从左侧开始。
  • include中引用了app_bar_draw
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.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">

    <include
        android:id="@+id/app_bar_draw"
        layout="@layout/app_bar_draw"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="200dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_draw"
        app:menu="@menu/activity_main_drawer" />
</androidx.drawerlayout.widget.DrawerLayout>

nav_header_draw

这个xml就是侧边栏的这个位置
在这里插入图片描述
看自己是否需要,我用的默认的xml文件,可以根据自己的需求调整

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="@dimen/nav_header_height"
    android:background="@drawable/side_nav_bar"
    android:gravity="bottom"
    android:orientation="vertical"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:theme="@style/ThemeOverlay.AppCompat.Dark">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@string/nav_header_desc"
        android:paddingTop="@dimen/nav_header_vertical_spacing"
        app:srcCompat="@mipmap/ic_launcher_round" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="@dimen/nav_header_vertical_spacing"
        android:text="@string/nav_header_title"
        android:textAppearance="@style/TextAppearance.AppCompat.Body1" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/nav_header_subtitle" />
</LinearLayout>

app:menu=“@menu/activity_main_drawer”

关于drawer_layout的菜单资源,我写了一个可以折叠展开二级菜单的item

<menu
    xmlns:android="http://schemas.android.com/apk/res/android">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/FirstAge"
            android:title="首页"
            android:visible="true"
            android:icon="@drawable/baseline_arrow_drop_down_24" />

        <item
            android:id="@+id/Dashboard"
            android:checked="false"
            android:title="仪表盘"
            android:visible="false"
            />
        <item
            android:id="@+id/StudyTutorial"
            android:checked="false"
            android:title="学习教程"
            android:visible="false" />
        <item
            android:id="@+id/VideoTutorials"
            android:checked="false"
            android:title="视频教程"
            android:visible="false" />
    </group>

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/Commodity"
            android:title="商品"
            android:visible="true"
            android:icon="@drawable/baseline_arrow_drop_down_24"/>
        <item
            android:id="@+id/ProductList"
            android:checked="false"
            android:title="商品列表"
            android:visible="false"/>
        <item
            android:id="@+id/AddProduct"
            android:checked="false"
            android:title="添加商品"
            android:visible="false"/>
        <item
            android:id="@+id/Category"
            android:checked="false"
            android:title="商品分类"
            android:visible="false"/>
        <item
            android:id="@+id/ProductType"
            android:checked="false"
            android:title="商品类型"
            android:visible="false"/>
        <item
            android:id="@+id/Branding"
            android:checked="false"
            android:title="品牌管理"
            android:visible="false"/>
    </group>

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/OrderForGoods"
            android:title="订单"
            android:visible="true"
            android:icon="@drawable/baseline_arrow_drop_down_24"/>
        <item
            android:id="@+id/Orderlist"
            android:checked="false"
            android:title="订单列表"
            android:visible="false"/>
        <item
            android:id="@+id/OrderSettings"
            android:checked="false"
            android:title="订单设置"
            android:visible="false"/>
        <item
            android:id="@+id/ReturnApplicationProcessing"
            android:checked="false"
            android:title="退货申请处理"
            android:visible="false"/>
        <item
            android:id="@+id/ReturnReasonSettings"
            android:checked="false"
            android:title="退货原因设置"
            android:visible="false"/>
    </group>
    <group android:checkableBehavior="single">
        <item
            android:id="@+id/Marketing"
            android:title="营销"
            android:visible="true"
            android:icon="@drawable/baseline_arrow_drop_down_24"/>
        <item
            android:id="@+id/ListOfFlashKillingActivities"
            android:checked="false"
            android:title="秒杀活动列表"
            android:visible="false"/>
        <item
            android:id="@+id/CouponList"
            android:checked="false"
            android:title="优惠券列表"
            android:visible="false"/>
        <item
            android:id="@+id/BrandRecommendation"
            android:checked="false"
            android:title="品牌推荐"
            android:visible="false"/>
        <item
            android:id="@+id/NewProductRecommendation"
            android:checked="false"
            android:title="新品推荐"
            android:visible="false"/>
        <item
            android:id="@+id/PopularRecommendation"
            android:checked="false"
            android:title="人气推荐"
            android:visible="false"/>
        <item
            android:id="@+id/SpecialRecommendation"
            android:checked="false"
            android:title="专题推荐"
            android:visible="false"/>
        <item
            android:id="@+id/AdvertisingList"
            android:checked="false"
            android:title="广告列表"
            android:visible="false"/>
    </group>
    <group android:checkableBehavior="single">
        <item
            android:id="@+id/LimitsOfAuthority"
            android:title="权限"
            android:visible="true"
            android:icon="@drawable/baseline_arrow_drop_down_24"/>
        <item
            android:id="@+id/UserList"
            android:checked="false"
            android:title="用户列表"
            android:visible="false"/>
        <item
            android:id="@+id/RoleList"
            android:checked="false"
            android:title="角色列表"
            android:visible="false"/>
        <item
            android:id="@+id/MenuList"
            android:checked="false"
            android:title="菜单列表"
            android:visible="false"/>
        <item
            android:id="@+id/ResourceList"
            android:checked="false"
            android:title="资源列表"
            android:visible="false"/>
    </group>
</menu>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1042984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

低代码代理商选对合作对象,和靠谱的低代码携手共进

随着低代码发展不断升温&#xff0c;市场上涌现出许多优秀的低代码开发平台&#xff0c;如阿里、腾讯、微软等企业相继推出了自己的低代码产品。 据IDC新近发布的《2022下半年中国低代码与零代码软件市场跟踪报告》显示&#xff0c;预计2023年中国低代码与零代码软件市场规模将…

10.6 开关型稳压电路

线性稳压电路具有结构简单、调节方便、输出电压稳定性强、纹波电压小等优点。但是&#xff0c;由于调整管始终工作在放大的状态&#xff0c;自身功耗较大&#xff1b;故效率较低&#xff0c;甚至仅为 30 % ∼ 40 % 30\%\sim40\% 30%∼40%。而且&#xff0c;为了解决调整管散热…

新的阶乘(筛素数)--2023百度之星初赛第三场

解析&#xff1a; 因为一个素数 x&#xff0c;他的所有倍数中都有因子为 x&#xff0c;所以先筛出所有素数&#xff0c;然后对于某个素数&#xff0c;累加他后面所有倍数的因子 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N1e75; int…

Vue中props报错或问题解决

一、[Vue warn]: The data property "inputUserData" is already declared as a prop. Use prop default value instead. 意思&#xff1a;"inputUserData"这个值已经声明成了一个prop数据&#xff0c;挂载的时候将默认使用prop中的"inputUserData&q…

自学WEB后端02-基于Express框架完成一个交互留言板!

提示&#xff1a; 浏览器V8是JavaScript的前端运行环境 Node.js 是JavaScript 的后端运行环境 Node.js 中无法调用 DOM 和 BOM等浏览器内置 API 这个作业案例包含2部分内容&#xff0c; 第一部分是前端 前端完成界面内容CSS框架 第二部分是后端 完成用户留言存储&#xf…

解密智能化评估在培训考试系统中的应用

智能化评估在培训考试系统中的应用旨在提供更全面和准确的评估方式&#xff0c;以帮助培训机构或个人评估学员的学习成果。该系统结合了现代技术和评估理论&#xff0c;能够自动化地进行评估、反馈和分析&#xff0c;提供个性化的学习支持和指导。 智能化评估系统通过采集学员…

【RK3588】Firefly 瑞芯微板子入门知识、和环境篇

公司买了块瑞芯微的移动开发板&#xff0c;准备将公司的主营业务的AI模型&#xff0c;从服务器主机&#xff0c;移动到开发板上面。所以&#xff0c;就选择了瑞芯微的RK3588的板子。 从目前市面上出现的板子来看&#xff0c;主要的还是以瑞芯微的板子为主&#xff0c;比如鸣辰…

Matlab写入nc文件遇到‘Start+count exceeds dimension bound (NC_EEDGE)‘问题的解决办法

最近在使用matlab写入nc文件&#xff0c;具体的处理视频可参见B站视频&#xff08;1.matlab处理nc文件--文件读取和写入_哔哩哔哩_bilibili&#xff09;但是遇到了以下的问题&#xff1a; Error using netcdflib The NetCDF library encountered an error during execution of…

2002-2020年341个地级市农业保险保费收入数据

2002-2020年341个地级市农业保险收入数据 1、时间&#xff1a;2002-2020年 2、范围&#xff1a;341个地级市 3、指标&#xff1a;农业保险收入 4、来源&#xff1a;整理自wind、保险年鉴 5、指标解释&#xff1a; 农业保险保费收入是指保险公司从农户或农业生产经营者那里…

伺服丝杠系统常用运算功能块

这篇博客主要介绍伺服、丝杠系统常用的运算功能块,其它相关运算可以查看下面文章链接: 信捷PLC脉冲频率、位移、转速相关计算(C语言编程应用)_RXXW_Dor的博客-CSDN博客里工业控制张力控制无处不在,也衍生出很多张力控制专用控制器,磁粉制动器等,本篇博客主要讨论PLC的张力…

【LeetCode热题100】--206.反转链表

206.反转链表 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ clas…

分布式文件存储系统minio、大文件分片传输

上传大文件 1、Promise对象 Promise 对象代表一个异步操作&#xff0c;有三种状态&#xff1a; pending: 初始状态&#xff0c;不是成功或失败状态。fulfilled: 意味着操作成功完成。rejected: 意味着操作失败。 只有异步操作的结果&#xff0c;可以决定当前是哪一种状态&a…

【编译和链接——详解】

1. 翻译环境和运行环境&#x1f4bb; 在ANSI C的任何⼀种实现中&#xff0c;存在两个不同的环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执⾏的机器指令。 第2种是执⾏环境&#xff0c;它⽤于实际执⾏代码。 2. 翻译环境&#x1f4bb; 那翻译环境是怎么将…

【app篇】可拖拽BLE遥控app简单版本

可拖拽配置蓝牙控制app 忘记过去&#xff0c;超越自己 ❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-09-26 ❤️❤️ 本篇更新记录 2023-09-26 ❤️&#x1f389; 欢迎关注 &#x1f50e;点赞 &#x1f44d;收藏 ⭐️留言&a…

全面解析“由于找不到msvcp140.dll无法继续执行代码”的5个解决方法

找不到 msvcp140.dll 文件可能会导致许多程序无法正常运行&#xff0c;这给许多用户带来了困扰。当您遇到由于找不到 msvcp140.dll 无法继续执行代码的问题时&#xff0c;您可以尝试以下方法来解决问题。 首先&#xff0c;了解 msvcp140.dll 文件的作用是很重要的。msvcp140.dl…

POI导入时经常碰到字段类型和导入的类型冲突

我们在用poi导入时导入的Excel列的字段类型经常和实体类里的不一致 //导入类 public class ImportVo {ExcelVOAttribute(name "名称",column"A")private String mc;ExcelVOAttribute(name "数量",column"B")private Integer sl;Exc…

WARNING:tensorflow:Your input ran out of data; interrupting training. 解决方法

问题详情&#xff1a; WARNING:tensorflow:Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least steps_per_epoch * epochs batches (in this case, 13800 batches). You may need to use the repeat() funct…

CentOS 7 安装 Tomcat

CentOS 7 安装 Tomcat&#xff08;注意版本号要与自己的版本一致&#xff09; 在/usr/local/下新建文件夹tomcat&#xff1a; cd /usr/local/mkdir tomcatcd tomcat上传tomcat8.5到linux的/usr/local/tomcat下 进入tomcat文件夹下&#xff1a; cd /usr/local/tomcatyum安装…

tensor数学运算

运算函数加add减sub乘mul除div矩阵相乘matmul次方pow平方根及其倒数sqrt 和 rsqrt向下/向上取整floor / ceil分离出整数/小数trunc / frac近似解四舍五入round裁剪clamp 1、矩阵元素的加减乘除 注意是矩阵间对应位置元素进行加减乘除 add 和 a torch.rand(3,4) b torch.…

ardupilot开发 ---传感器驱动,外设驱动篇

ardupilot支持不同厂商的传感器&#xff0c;如雷达&#xff0c;声呐&#xff0c;激光&#xff0c;相机等&#xff1b; 支持的通信协议 I2C, SPI, UART (aka Serial) CANBUS 驱动程序的前后台分离 ardupilot中传感器驱动的重要结构是前后分离&#xff1b; Library库调用前端…