【Android】设置全局标题栏
序言
在做项目的时候,有时候需要一个全局统一的标题栏,保证项目风格的统一,但是如果在每个activity上面都写一遍这个标题栏就很麻烦了,我们经常用的方法就是写个基类Activity,然后当某个Activity需要这个统一的标题栏的时候,继承这个Activity就好了。
实现
1.实现我们需要的标题栏的视图
例如:我们现在需要一个标题栏,左边是Back按钮,返回按钮旁边有文字提示,中间是文字显示,右侧是Home按钮。
我们需要在xml文件中写出这种布局(代码略)
2.创建View加载布局
public class NavBarLayout extends LinearLayout {private ImageView backNav;private TextView backName;private TextView centerName;private ImageView homeNav;private INavClickListener listener;public NavBarLayout(Context context) {super(context);init(context);}public NavBarLayout(Context context, AttributeSet attrs) {super(context, attrs);init(context);}public NavBarLayout(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context);}public void setNavClickListener(INavClickListener iNavClickListener) {this.listener = iNavClickListener;}private void init(Context mContext) {LayoutInflater.from(mContext).inflate(R.layout.layout_top_nav_bar, this);backNav = findViewById(R.id.image_back);backName = findViewById(R.id.text_back);centerName = findViewById(R.id.ext_center);homeNav = findViewById(R.id.mage_home);//这是为了增大Back的返回按钮点击区域,将Back按钮和Name区域放在一起LinearLayout llBack = findViewById(R.id.ll_back_tap);//默认实现listener = new INavClickListener() {@Overridepublic void backClick(Context context) {INavClickListener.super.backClick(context);}@Overridepublic void homeClick(Context context) {INavClickListener.super.homeClick(context);}};//点击返回按钮llBack.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View view) {if (listener != null) {listener.backClick(mContext);}}});//点击Home按钮homeNav.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View view) {if (listener != null) {listener.homeClick(mContext);}}});}/*** 设置返回按钮图片*/public NavBarLayout setNavBackImage(int res) {backNav.setImageResource(res);return this;}/*** 设置返回按钮旁边的文字*/public NavBarLayout setNavBackName(String text) {backName.setText(text);return this;}/*** 设置中间的文字*/public NavBarLayout setNavCenterText(String text) {centerName.setText(text);return this;}/*** 设置Home按钮图片*/public NavBarLayout setNavHomeImage(int res) {homeNav.setImageResource(res);return this;}/*** 设置中间文字是否显示*/public NavBarLayout setNavCenterIsShow(boolean isShow) {if (isShow) {centerName.setVisibility(View.VISIBLE);} else {centerName.setVisibility(View.GONE);}return this;}/*** 设置Home图案是否显示*/public NavBarLayout setNavHomeIsShow(boolean isShow) {if (isShow) {homeNav.setVisibility(View.VISIBLE);} else {homeNav.setVisibility(View.GONE);}return this;}public interface INavClickListener {//默认实现点击返回上一层default void backClick(Context context) {Activity activity = (Activity) context;activity.onBackPressed();};//默认实现跳转到某个页面(比如主页面)default void homeClick(Context context) {//这里使用了DRouter框架实现页面跳转DRouter.build("/main").start(context);};}
}
这样的话我们的View就实现了,接下来就是在基类里面使用。
3.基类使用
3.1创建基类的xml文件【layout_base】
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/ll_view_base"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#DBE5F1"android:orientation="vertical"><com.view.NavBarLayoutandroid:id="@+id/base_nav"android:layout_width="match_parent"android:layout_height="60dp"android:visibility="visible" /><FrameLayoutandroid:id="@+id/ll_child_view"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>
这里我们使用一个上下布局的线性布局,上边是我们的标题栏布局,下面我们使用了一个FrameLayout帧布局,强烈推荐使用这种布局,不容易产生各种莫名其妙的问题。我们以后使用这个FrameLayout加载我们的子类activity的布局。
3.2基类的Activity
public class BaseActivity extends AppCompatActivity {private NavBarLayout navBarLayout;@Overridepublic void setContentView(int layoutResID) {super.setContentView(R.layout.layout_base); // 设置整个布局为基础布局Objects.requireNonNull(getSupportActionBar()).hide(); // 隐藏ActionBar/ToolbarFrameLayout parentView = findViewById(R.id.ll_child_view); // 获取基础布局中的父容器navBarLayout = findViewById(R.id.base_nav); // 获取基础布局中的导航栏View childView = LayoutInflater.from(this).inflate(layoutResID, parentView, false); // 根据传入的布局资源ID,生成子视图parentView.addView(childView); // 将子视图添加到父容器中}@Overridepublic void setContentView(View childView) {super.setContentView(R.layout.layout_base);Objects.requireNonNull(getSupportActionBar()).hide();FrameLayout parentView = findViewById(R.id.ll_child_view);navBarLayout = findViewById(R.id.base_nav);parentView.addView(childView);}@Overridepublic void setContentView(View view, ViewGroup.LayoutParams params) {super.setContentView(R.layout.layout_base);Objects.requireNonNull(getSupportActionBar()).hide();FrameLayout parentView = findViewById(R.id.ll_child_view);navBarLayout = findViewById(R.id.base_nav);parentView.addView(view, params);}//是否展示我们的导航栏protected void showNavBar(boolean isShow) {if (isShow) {navBarLayout.setVisibility(View.VISIBLE);} else {navBarLayout.setVisibility(View.GONE);}}//给外界提供修改我们导航栏的方法protected NavBarLayout setNavBar() {return this.navBarLayout;}
}
这里面我们可以注意到,我们将这个【setContentView】实现了三次,这是非常有必要的,因为我们不知道将来我们到底使用哪一种方法将子Activity的视图加载进来。
4.使用
我们创建一个activity,然后继承这个基类的activity,这样我们就可以使用了。通过我们的【setNavBar()】方法可以修改我们默认的一些显示文字和进行我们默认设置的按钮的点击跳转设置。
相关文章:

【Android】设置全局标题栏
序言 在做项目的时候,有时候需要一个全局统一的标题栏,保证项目风格的统一,但是如果在每个activity上面都写一遍这个标题栏就很麻烦了,我们经常用的方法就是写个基类Activity,然后当某个Activity需要这个统一的标题栏…...

R语言的入门学习
目录 准备工作导入csv数据集选择前200行作为数据集展示数据集的前/后几N行宏观分析删除缺失值构建直方图导出为图片 R语言常见图像类型例1:散点图例2:散点矩阵图 准备工作 安装教程: R语言和RStudio的下载安装(非常简便舒适&…...

【开源】基于Vue和SpringBoot的民宿预定管理系统
项目编号: S 058 ,文末获取源码。 \color{red}{项目编号:S058,文末获取源码。} 项目编号:S058,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色…...
nacos集群部署
GitHub - nacos-group/nacos-k8s: This project contains a Nacos Docker image meant to facilitate the deployment of Nacos on Kubernetes using StatefulSets. 需要修改两个文件 --- apiVersion: v1 kind: Service metadata:name: nacos-headlessnamespace: project-guli…...

9、传统计算机视觉 —— 边缘检测
本节介绍一种利用传统计算机视觉方法来实现图片边缘检测的方法。 什么是边缘检测? 边缘检测是通过一些算法来识别图像中物体之间,或者物体与背景之间的边界,也就是边缘。 边缘通常是图像中灰度变化显著的地方,标志着不同区域的分界线。 在一张图像中,边缘可以是物体的…...

Linux tc 使用
tc模拟延时丢包等网络故障依赖的内核驱动 /lib/modules/5.15.0-52-generic/kernel/net/sched/sch_netem.ko有些系统并不是默认就安装上该驱动的,如果没有安装该驱动,构造网络故障时会报错。 root:curtis# tc qdisc change dev enp4s0 root netem delay…...

从0开始学习JavaScript--JavaScript 数字与日期
JavaScript中的数字和日期是处理数值计算和时间相关任务的核心。本文将深入研究JavaScript中数字的表示、常见运算,以及日期对象的创建、格式化等操作,并通过丰富的示例代码,可以更全面地了解和应用这些概念。 JavaScript数字基础 JavaScri…...

从关键新闻和最新技术看AI行业发展(2023.11.6-11.19第十期) |【WeThinkIn老实人报】
Rocky Ding 公众号:WeThinkIn 写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术,同时Rocky会对这些关键信息进行解读,力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议,一起交流学习&…...

计算机硬件的基本组成
一、冯诺依曼结构 存储程序: “存储程序”的概念是指将指令以二进制代码的形式事先输入计算机的主存储器,然后按其在存储器中的首地址执行程序的第一条指令,以后就按该程序的规定顺序执行其他指令,直至程序执行结束。 冯诺依曼计…...
【算法-哈希表3】四数相加2 和 赎金信
今天,带来哈希表相关算法的讲解。文中不足错漏之处望请斧正! 理论基础点这里 1. 四数相加2 分析题意 求符合条件的四元组的出现次数,条件: nums1nums2nums3nums4 从四个数组中的每一个数组取一个数 num1, num2, num3, num4&am…...

wpf devexpress自定义编辑器
打开前一个例子 步骤1-自定义FirstName和LastName编辑器字段 如果运行程序,会通知编辑器是空。对于例子,这两个未命名编辑器在第一个LayoutItem(Name)。和最终用户有一个访客左右编辑器查阅到First Name和Last Name字段,分别。如果你看到Go…...

文档向量化工具(一):Apache Tika介绍
Apache Tika是什么?能干什么? Apache Tika是一个内容分析工具包。 该工具包可以从一千多种不同的文件类型(如PPT、XLS和PDF)中检测并提取元数据和文本。 所有这些文件类型都可以通过同一个接口进行解析,这使得Tika在…...
学习c#的第二十一天
目录 C# 泛型(Generic) 泛型类型参数 类型参数的约束 约束多个参数 未绑定的类型参数 类型参数作为约束 notnull 约束 class 约束 default 约束 非托管约束 委托约束 枚举约束 类型参数实现声明的接口 泛型类 泛型方法 泛型和数组 泛型…...

Michael Jordan最新报告:去中心化机器学习中的契约、不确定性和激励
导读 11月3日,智源研究院学术顾问委员会委员、机器学习泰斗Michael Jordan在以“新一代人工智能前沿”为主题的2023北京论坛 新工科专题论坛上,发表了题为Contracts, Uncertainty, and Incentives in Decentralized Machine Learning(去…...

3ds Max渲染用专业显卡还是游戏显卡?
使用3dsmax建模时,会面临诸多选择,除了用vr还是cr的决策,硬件选择上也存在着疑问,比如用专业显卡还是消费级游戏显卡?一般来说,除非是特别专业的大型项目和软件,且预算在5位数以上,常…...

airlearning-ue4安装的踩坑记录
最近要安装airlearning-ue4,用于实现无人机仿真环境,该项目地址为:GitHub - harvard-edge/airlearning-ue4: Environment Generator for Air Learning Project. This version is build on top of UE4 game engine 由于这个项目已经完成好几年…...

uniapp优化h5项目-摇树优化,gzip压缩和删除console.log
1.摇树优化 勾选摇树优化,打包删除死代码 2.gzip压缩和删除console.log 安装插件webpack和compression-webpack-plugin webpack插件 npm install webpack4.46.0 --save-devcompression-webpack-plugin插件 npm install compression-webpack-plugin6.1.1 --save-devconst Com…...

Pycharm之配置python虚拟环境
最近给身边的人写了脚本,在自己电脑可以正常运行。分享给我身边的人,却运行不起来,然后把报错的截图给我看了,所以难道不会利用pycharm搭建虚拟的环境?记录一下配置的过程。 第一步:右键要打开的python的代…...
如何使用MybatisPlus进行数据分页显示
如何使用MybatisPlus进行数据的分页呢? 使用Mybatis Plus提供的分页插件来简化开发,在MybatisPlusInterceptor的拦截器中添加自动分页的PaginationInnerInterceptor拦截器,当前配置需要交给spring的bean管理,类上添加注解Configu…...

代码随想录 Day49 单调栈01 LeetCode LeetCodeT739每日温度 T496 下一个最大元素I
前言 折磨的死去活来的动态规划终于结束啦,今天秋秋给大家带来两题非常经典的单调栈问题,可能你不清楚单调栈是什么,可以用来解决什么问题,今天我们就来一步一步的逐渐了解单调栈,到能够灵活使用单调栈.注意以下讲解中,顺序的描述为 从栈头到栈底的顺序 什么时候用单…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...