【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() {
            @Override
            public void backClick(Context context) {
                INavClickListener.super.backClick(context);
            }

            @Override
            public void homeClick(Context context) {
                INavClickListener.super.homeClick(context);
            }
        };
        //点击返回按钮
        llBack.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                if (listener != null) {
                    listener.backClick(mContext);
                }
            }
        });

        //点击Home按钮
        homeNav.setOnClickListener(new OnClickListener() {

            @Override
            public 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.NavBarLayout
        android:id="@+id/base_nav"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:visibility="visible" />

    <FrameLayout
        android: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;

    @Override
    public void setContentView(int layoutResID) {
        super.setContentView(R.layout.layout_base); // 设置整个布局为基础布局
        Objects.requireNonNull(getSupportActionBar()).hide(); // 隐藏ActionBar/Toolbar
        FrameLayout 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); // 将子视图添加到父容器中
    }

    @Override
    public 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);
    }

    @Override
    public 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()】方法可以修改我们默认的一些显示文字和进行我们默认设置的按钮的点击跳转设置。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu中/etc/rc.local和/etc/init.d/rc.local的区别是什么

在早期版本的Ubuntu中&#xff0c;通常会使用 /etc/rc.local 或 /etc/init.d/rc.local 文件执行在系统启动时需要运行的自定义脚本或命令。然而&#xff0c;随着Ubuntu的版本升级&#xff0c;这两者的使用方式有了一些变化。 /etc/rc.local&#xff1a; 功能&#xff1a; /etc/…

ATFX汇市:英国通胀率大降两个百分点,GBPUSD止步近两月高点

ATFX汇市&#xff1a;据英国国家统计局数据&#xff0c;英国10月CPI年率最新值4.6%&#xff0c;远低于前值6.7%&#xff0c;低于预期值4.8%&#xff0c;英国通胀率大降温&#xff0c;降幅高达2.1个百分点&#xff0c;远远超出市场预期。4.6%的通胀率是2021年10月以来最低值。主…

基于Vue+SpringBoot的高校大学生创业管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统公告模块2.2 创业项目模块2.3 创业社团模块2.4 政府政策模块2.5 创业比赛模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 系统公告表3.2.2 创业项目表3.2.3 创业社团表3.2.4 政策表 四、系统展示五、核心代码5.…

Java 12 及Tomcat 部署配置

使用的软件版本 1. Java12部署 和之前的Java版本不太一样&#xff0c;12版本不用配置JRE环境。 解压缩文件夹 root账户执行 tar -xzvf /home/software/jdk-12.0.2_linux-x64_bin.tar.gz创建java文件夹 root账户执行 cd /usr mkdir java移动Java文件到创建的文件夹下 root账…

在计算机领域如神一般存在的人都有哪些?

✍️作者简介&#xff1a;沫小北/码农小北&#xff08;专注于Android、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a;沫小北/码农小北 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN &#x1f514;如果文章对您有一定的帮助请&…

FastJsonAPI

maven项目 pom.xml <dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.26</version></dependency><dependency><groupId>junit</groupId>&l…

OpenCV入门5——OpenCV的算术与位运算

文章目录 图像的加法运算图像的减法运算图像的乘除运算图像的融合OpenCV位运算-非操作OpenCV位操作-与运算OpenCV位操作-或与异或为图像添加水印 图像的加法运算 # -*- coding: utf-8 -*- import cv2 import numpy as npimg cv2.imread(E://pic//4.jpg)# 图的加法运算就是矩阵…

11月24日 AI+软件研发数字峰会(AiDD)即将启航!

▼ 伴随着人工智能&#xff08;AI&#xff0c;特别是大语言模型&#xff09;在众多行业领域的广泛应用及其带来的颠覆性变革&#xff0c;软件的开发模式、方式和实践都可能会发生巨大的变化。为助力更多企业在人工智能的浪潮中乘风破浪&#xff0c;“AI软件研发数字峰会&#x…

ssm+vue的OA办公系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的OA办公系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 项目介绍&a…

OpenCV技术应用(3)— 把.png图像保存为.jpg图像

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本节课就手把手教你如何把.png图像保存为.jpg图像&#xff0c;希望大家学习之后能够有所收获~&#xff01;&#x1f308; 目录 &#x1f680;1.技术介绍 &#x1f680;2.实现代码 &#x1f680;1.技术介绍 如果在电脑某…

【C语言】深入理解数据表示与存储

文章目录 1.分析上述源程序中的变量在机器内是如何表示的1.1.并给出变量在内存中的存储情况&#xff08;变量占多少个字节&#xff0c;每个字节的地址和存放的数据是多少&#xff09;1.2.说明其存放顺序&#xff08;大端、小端次序&#xff1f;&#xff09;1.3.对齐方式&#x…

统信UOS_麒麟KYLINOS禁用USB存储

原文链接&#xff1a;统信UOS/麒麟KYLINOS禁用USB存储 hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇在统信UOS/麒麟KYLINOS禁用USB存储的文章&#xff0c;文章通过三种方式&#xff1a;1、在文件管理器中通过图形化方式移除USB&#xff1b;2、通过禁用USB存储模块…

Bumptop——3D桌面一键get

今天&#xff0c;博主给大家带来一款免费、炫酷的桌面真理工具——Bumptop。这是一款可使桌面变为极酷3D桌面的软件。采用极酷的3D技术&#xff0c;把图标立体化&#xff0c;同时拖拽动作也是别有动感&#xff0c;充满智慧&#xff0c;可以完全抛弃原先单调的2D和伪3D界面&…

【Axure教程】滑动内容选择器

滑动内容选择器通常是一种用户界面组件&#xff0c;允许用户通过滑动手势在一组内容之间进行选择。这种组件可以在移动应用程序或网页中使用&#xff0c;以提供直观的图片选择体验。 那今天就教大家如何用中继器制作一个滑动内容选择器&#xff0c;我们会以滑动选择电影为案例…

mysql binlog

binlog日志介绍 什么是 binlog binlog是server层共有的&#xff0c;是记录的数据更新历史&#xff0c;主要用来做主从同步和数据的实时备份。 binlog 怎么开启 mysql的配置文件添加相关配置并重启mysql # 1. linux打开mysql配置文件 vi /etc/my.cnf# 2. 添加binlog配置 [mysql…

Redis怎么保证数据不丢失

目录 一、Redis使用持久化保证数据不丢失 二、Redis 持久化的三种方式 三、混合持久化的流程 一、Redis使用持久化保证数据不丢失 Redis 中的数据是存放在内存中的&#xff0c;这样可以保证 Redis 高效的运行&#xff0c;然而内存中的数据会随着系统的重启而丢失&#xff0c;那…

栈与队列练习题

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

Python基础入门----如何通过conda搭建Python开发环境

文章目录 使用 conda 搭建Python开发环境是非常方便的,它可以帮助你管理Python版本、依赖库、虚拟环境等。以下是一个简单的步骤,演示如何通过 conda 搭建Python开发环境: 安装conda: 如果你还没有安装 conda,首先需要安装Anaconda或Miniconda。Anaconda是一个包含很多数据…

Pytorch D2L Subplots方法对画图、图片处理

问题代码 def show_images(imgs, num_rows, num_cols, titlesNone, scale1.5): #save """绘制图像列表""" figsize (num_cols * scale, num_rows * scale) _, axes d2l.plt.subplots(num_rows, num_cols, figsizefigsize) axes axes.flatten…

全新叙事赛道:诺亚引领不良资产合成潮流,DeFi生态再添“万亿”动力

在全球DeFi领域&#xff0c;一场革命性的变革正在悄然兴起。诺亚项目以其独特的商业模式和前瞻性的愿景成为DeFi 2.0的一股新力量。作为全球首家专注于不良资产合成铸币的平台&#xff0c;诺亚项目凭借其强大的经济模型和全新的叙事赛道&#xff0c;正迅速崭露头角&#xff0c;…