当前位置: 首页 > news >正文

【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】设置全局标题栏

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

R语言的入门学习

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

【开源】基于Vue和SpringBoot的民宿预定管理系统

项目编号&#xff1a; S 058 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S058&#xff0c;文末获取源码。} 项目编号&#xff1a;S058&#xff0c;文末获取源码。 目录 一、摘要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有些系统并不是默认就安装上该驱动的&#xff0c;如果没有安装该驱动&#xff0c;构造网络故障时会报错。 root:curtis# tc qdisc change dev enp4s0 root netem delay…...

从0开始学习JavaScript--JavaScript 数字与日期

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

从关键新闻和最新技术看AI行业发展(2023.11.6-11.19第十期) |【WeThinkIn老实人报】

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

计算机硬件的基本组成

一、冯诺依曼结构 存储程序&#xff1a; “存储程序”的概念是指将指令以二进制代码的形式事先输入计算机的主存储器&#xff0c;然后按其在存储器中的首地址执行程序的第一条指令&#xff0c;以后就按该程序的规定顺序执行其他指令&#xff0c;直至程序执行结束。 冯诺依曼计…...

【算法-哈希表3】四数相加2 和 赎金信

今天&#xff0c;带来哈希表相关算法的讲解。文中不足错漏之处望请斧正&#xff01; 理论基础点这里 1. 四数相加2 分析题意 求符合条件的四元组的出现次数&#xff0c;条件&#xff1a; nums1nums2nums3nums4 从四个数组中的每一个数组取一个数 num1, num2, num3, num4&am…...

wpf devexpress自定义编辑器

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

文档向量化工具(一):Apache Tika介绍

Apache Tika是什么&#xff1f;能干什么&#xff1f; Apache Tika是一个内容分析工具包。 该工具包可以从一千多种不同的文件类型&#xff08;如PPT、XLS和PDF&#xff09;中检测并提取元数据和文本。 所有这些文件类型都可以通过同一个接口进行解析&#xff0c;这使得Tika在…...

学习c#的第二十一天

目录 C# 泛型&#xff08;Generic&#xff09; 泛型类型参数 类型参数的约束 约束多个参数 未绑定的类型参数 类型参数作为约束 notnull 约束 class 约束 default 约束 非托管约束 委托约束 枚举约束 类型参数实现声明的接口 泛型类 泛型方法 泛型和数组 泛型…...

Michael Jordan最新报告:去中心化机器学习中的契约、不确定性和激励

‍ ‍导读 11月3日&#xff0c;智源研究院学术顾问委员会委员、机器学习泰斗Michael Jordan在以“新一代人工智能前沿”为主题的2023北京论坛 新工科专题论坛上&#xff0c;发表了题为Contracts, Uncertainty, and Incentives in Decentralized Machine Learning&#xff08;去…...

3ds Max渲染用专业显卡还是游戏显卡?

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

airlearning-ue4安装的踩坑记录

最近要安装airlearning-ue4&#xff0c;用于实现无人机仿真环境&#xff0c;该项目地址为&#xff1a;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虚拟环境

最近给身边的人写了脚本&#xff0c;在自己电脑可以正常运行。分享给我身边的人&#xff0c;却运行不起来&#xff0c;然后把报错的截图给我看了&#xff0c;所以难道不会利用pycharm搭建虚拟的环境&#xff1f;记录一下配置的过程。 第一步&#xff1a;右键要打开的python的代…...

如何使用MybatisPlus进行数据分页显示

如何使用MybatisPlus进行数据的分页呢&#xff1f; 使用Mybatis Plus提供的分页插件来简化开发&#xff0c;在MybatisPlusInterceptor的拦截器中添加自动分页的PaginationInnerInterceptor拦截器&#xff0c;当前配置需要交给spring的bean管理&#xff0c;类上添加注解Configu…...

代码随想录 Day49 单调栈01 LeetCode LeetCodeT739每日温度 T496 下一个最大元素I

前言 折磨的死去活来的动态规划终于结束啦,今天秋秋给大家带来两题非常经典的单调栈问题,可能你不清楚单调栈是什么,可以用来解决什么问题,今天我们就来一步一步的逐渐了解单调栈,到能够灵活使用单调栈.注意以下讲解中&#xff0c;顺序的描述为 从栈头到栈底的顺序 什么时候用单…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...