【Android】设置全局标题栏

news2024/11/24 10:34:54

序言

在做项目的时候,有时候需要一个全局统一的标题栏,保证项目风格的统一,但是如果在每个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()】方法可以修改我们默认的一些显示文字和进行我们默认设置的按钮的点击跳转设置。

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

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

相关文章

我记不住的getopt_long的那些参数和返回值

前言&#xff1a;最近在学习面向Linux系统进行C语言的编程&#xff0c;通过查询man手册和查看网络上的各种文章来获取一点点的知识&#xff0c;重点是看完手册还是一脸懵逼&#xff0c;搞不懂手册里面再说啥&#xff0c;而本篇文章将记录一下学习getopt_long的那些参数和返回值…

NFTScan 正式上线 Viction NFTScan 浏览器和 NFT API 数据服务

2023 年 11 月 16 号&#xff0c;NFTScan 团队正式对外发布了 Viction NFTScan 浏览器&#xff0c;将为 Viction 生态的 NFT 开发者和用户提供简洁高效的 NFT 数据搜索查询服务。NFTScan 作为全球领先的 NFT 数据基础设施服务商&#xff0c;Viction 是继 Bitcoin、Ethereum、BN…

GUI编程--PyQt5--QTreeWidget

文章目录 树型控件展示数据修改节点数据获取所有节点的数据 Qt模组参考 QWidgets QTreeWidget 树型控件展示数据 展示数据的同时&#xff0c;每个节点标注数据类型。 class MyWindow(QWidget):def __init__(self, title):super(MyWindow, self).__init__()self.setWindowTitl…

qt笔记之qml和C++的交互系列(一):初记

code review! —— 杭州 2023-11-16 夜 文章目录 一.qt笔记之qml和C的交互&#xff1a;官方文档阅读理解0.《Overview - QML and C Integration》中给出五种QML与C集成的方法1.Q_PROPERTY&#xff1a;将C类的成员变量暴露给QML2.Q_INVOKABLE()或public slots&#xff1a;将C类…

【面试经典150 | 数学】回文数

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;反转一半数字 其他语言python3 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本…

遵循开源软件安全路线图

毫无疑问&#xff0c;开源软件对于满足联邦任务所需的开发和创新至关重要&#xff0c;因此其安全性至关重要。 OSS&#xff08;运营支持系统&#xff09; 支持联邦政府内的每个关键基础设施部门。 联邦政府认识到这一点&#xff0c;并正在采取措施优先考虑 OSS 安全&#xff…

Android Jetpack的组件介绍,常见组件解析

jetpack组件有哪些 Android Jetpack是一个集成Android应用程序组件的一站式解决方案。它使开发人员能够专注于他们的应用程序的真正创新部分&#xff0c;而不会受到Android平台特定的限制。Jetpack组件可分为四个类别&#xff1a; 架构组件&#xff08;Architecture Componen…

IDEA无法查看源码是.class,而不是.java解决方案?

问题&#xff1a;在idea中&#xff0c;ctrl鼠标左键进入源码&#xff0c;但是有时候会出现无法查看反编译的源码&#xff0c;如图&#xff01; 而我们需要的是方法1: mvn dependency:resolve -Dclassifiersources 注意&#xff1a;需要该模块的目录下&#xff0c;不是该文件目…

STM32_SPI总线驱动OLED详细原理讲解

目录 这里写目录标题 第13章 Cortex-M4-SPI总线13.1 SPI总线概述13.1.1 SPI总线介绍13.1.2 SPI总线接口与物理拓扑结构13.1.3 SPI总线通信原理13.1.4 SPI总线数据格式 13.2 IO口模拟SPI操作OLED13.2.1 常见的显示设备13.2.2 OLED显示屏概述13.2.3 OLED特征13.2.4 显示原理13.2.…

stylelint报错at-rule-no-unknown

stylelint报错at-rule-no-unknown stylelint还将各种 sass -rules 标记mixin为include显示未知错误 at-rule-no-unknown ✖ stylelint --fix:Deprecation warnings: 78:1 ✖ Unexpected unknown at-rule "mixin" at-rule-no-unknown 112:3 ✖ Unexpected un…

第四章 串【24王道数据结构笔记】

1.串的基本概念 串&#xff0c;即字符串 (String) 是由零个或多个字符组成的有限序列。一般记为Sa1a2.....an(n>0) S"HelloWorld!" TiPhone 11 Pro Max? 其中&#xff0c;S是串名&#xff0c;单引号括起来的字符序列是串的值;a;可以是字母、数字或其他字符;串中…

DocCMS keyword SQL注入漏洞复现 [附POC]

文章目录 DocCMS keyword SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 DocCMS keyword SQL注入漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测…

idea中误删.iml和.idea文件,如何处理

目录 一、问题描述 二、解决方案 1、理论知识 &#xff08;1&#xff09;.iml 文件 &#xff08;2&#xff09;.idea文件 2、操作环境 3、操作步骤 &#xff08;1&#xff09;找到【Maven】工具按钮 &#xff08;2&#xff09;点图标&#xff0c;重复导入maven项目&am…

Pikachu漏洞练习平台之XXE(XML外部实体注入)

目录 什么是 XML&#xff1f; 什么是DTD&#xff1f; 什么是XEE&#xff1f; 常见payload 什么是 XML&#xff1f; XML 指可扩展标记语言&#xff08;EXtensible Markup Language&#xff09;&#xff1b; XML 不会做任何事情&#xff0c;而是用来结构化、存储以及传输信息…

promise时效架构升级方案的实施及落地 | 京东物流技术团队

一、项目背景 为什么需要架构升级 promise时效包含两个子系统&#xff1a;内核时效计算系统&#xff08;系统核心是时效计算&#xff09;和组件化时效系统&#xff08;系统核心是复杂业务处理以及多种时效业务聚合&#xff0c;承接结算下单黄金流程流量&#xff09;&#xff…

SPASS-参数估计与假设检验

参数估计 点估计 点估计用样本统计量的值直接作为总体参数的估计值。如用样本均值直接作为总体均值的估计值,用样本方差直接作为总体方差的估计值等。 常用的点估计法 (1)矩估计法 (2)极大似然估计法 (3)稳健估计法 区间估计 因为点估计直接用样本估计值作为总体参数…

苹果MAC安装绿盾出现问题,安装时没有出现填服务器地址的页面,现在更改不了也卸载不了绿盾 怎么处理?

环境: Mac mini M1 Mac os 11.0 绿盾v6.5 问题描述: 苹果MAC安装绿盾出现问题,安装时没有出现填服务器地址的页面,现在更改不了也卸载不了绿盾 怎么处理? 解决方案: 大部分企业是Windows和Mac终端混合使用,在进行文档加密管理时通常会遇到不兼容的现象,而为了统一…

Ubuntu 18.04无网络连接的n种可能办法

文章目录 网络图标消失&#xff0c;Ubuntu无网络连接VMware上Ubuntu18.04&#xff0c;桥接了多个网卡&#xff0c;其中一个用来上网&#xff0c;均设置为静态ip网络桥接链路没有接对路由不对 网络图标消失&#xff0c;Ubuntu无网络连接 sudo service network-manager stop sud…

python趣味编程-5分钟实现一个谷歌恐龙游戏(含源码、步骤讲解)

Python 恐龙游戏是为想要学习 Python 的初学者创建的。该项目系统使用了 Pygame 和 Random 模块。 Pygame 是一组跨平台的 Python 模块,专为编写视频游戏而设计。 Python 中的 Dino Game有一个任务记录,其中包含图片文档和 Python 内容(dino.py)。 GUI 使用 pygame 库。

Linux C 线程间同步机制

线程间同步机制 概述保护机制互斥锁创建互斥锁  pthread_mutex_init加锁  pthread_mutex_lock解锁  pthread_mutex_unlock删除锁  pthread_mutex_destroy 条件变量创建条件变量  pthread_cond_init激活条件变量  pthread_cond_signal等待条件变量  pthread_cond_…