随便封装一下BaseActivity

老码农,没什么激情撸码,随便封装一下base类,写来玩玩

直接上源码

一、创建BaseActivity

1、使用viewBinding来绑定视图

2、利用代理实现状态栏、菊花扩展

abstract class BaseActivity<VB : ViewBinding> : AppCompatActivity() {protected lateinit var viewBinding: VB//状态栏代理private var toolbarStyle: DispenseToolbarStyle by DispenseToolbarStyleDelegate()//菊花val loadingAgent: ILoading? by lazy { LoadingManager.get().initLoading() }override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)viewBinding = ViewBindingFactory.createViewBinding(this, layoutInflater)toolbarStyle = getToolBarStyle()setContentView(viewBinding.root)registerLoadSir()initUI(savedInstanceState)}override fun onDestroy() {super.onDestroy()ToastUtils.cancelToast()}/*** 初始化UI*/protected abstract fun initUI(savedInstanceState: Bundle?)/*** 注册菊花*/protected open fun registerLoadSir() {}/*** 可重写此方法,修改状态栏样式*/open fun getToolBarStyle(): DispenseToolbarStyle =DispenseToolbar.get().defaultToolbarStyle() ?: DispenseToolbarStyle.WHITE
}

二、创建状态栏枚举DispenseToolbarStyle

enum class DispenseToolbarStyle {WHITE, BLACK, TRANSLATE, CUSTOM
}

三、创建状态栏属性代理类DispenseToolbarStyleDelegate

class DispenseToolbarStyleDelegate {operator fun getValue(thisRef: Any?, property: KProperty<*>): DispenseToolbarStyle {return DispenseToolbarStyle.WHITE}operator fun setValue(thisRef: Any?, property: KProperty<*>, value: DispenseToolbarStyle) {val activity = thisRef as Activitywhen (value) {DispenseToolbarStyle.TRANSLATE -> {BarUtils.setStatusBarFullTransparent(activity)BarUtils.setStatusBarColor(activity, Color.TRANSPARENT)}DispenseToolbarStyle.CUSTOM -> {DispenseToolbar.get().customToolbarStyle(activity)}DispenseToolbarStyle.BLACK -> {BarUtils.setStatusBarColor(activity, Color.BLACK, true)BarUtils.setLightMode(activity)}else -> {BarUtils.setStatusBarColor(activity, Color.WHITE, true)BarUtils.setDarkMode(activity)}}}
}

四、创建状态栏接口DispenseToolbarInterface

interface DispenseToolbarInterface {/*** 默认主题* @description 若为null,则默认是ChannelToolbarStyle.WHITE*/fun defaultToolbarStyle(): DispenseToolbarStyle?/*** 自定义主题* @description 若设置主题为自定义,则需要在此方法设置主题。* 若自定义多个主题,可以利用参数activity来判断*/fun customToolbarStyle(activity: Activity)}

五、实现interface,DispenseToolbar 利用静态代理,可以进一步把interface扩展(假设这写代码作为一个base库封装)

class DispenseToolbar : DispenseToolbarInterface {private var channelToolbarImpl: DispenseToolbarInterface? = nullcompanion object {@Volatileprivate var sInstance: DispenseToolbar? = nullfun get(): DispenseToolbar {if (sInstance == null) {synchronized(DispenseToolbar::class.java) {if (sInstance == null) {sInstance = DispenseToolbar()}}}return sInstance!!}}fun init(channelToolbarImpl: DispenseToolbarInterface) {this.channelToolbarImpl = channelToolbarImpl}override fun defaultToolbarStyle(): DispenseToolbarStyle? {return channelToolbarImpl?.defaultToolbarStyle()}override fun customToolbarStyle(activity: Activity) {channelToolbarImpl?.customToolbarStyle(activity)}}

六、代理实现DispenseToolbarImpl,若需要自定义不同的style可以,利用activity参数判断

class DispenseToolbarImpl : DispenseToolbarInterface {override fun defaultToolbarStyle(): DispenseToolbarStyle? {return DispenseToolbarStyle.CUSTOM}override fun customToolbarStyle(activity: Activity) {BarUtils.setStatusBarColor(activity,ContextCompat.getColor(activity, R.color.barTheme),true)BarUtils.setDarkMode(activity)}
}

七、初始化静态代理,可在application初始化

DispenseToolbar.get().init(DispenseToolbarImpl())

此时菊花与BaseActivity的封装已完成。

这里的属性代理或静态代理也可以减去一层,看自己喜好。

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

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

相关文章

FairGuard游戏加固入选《CCSIP 2023中国网络安全行业全景册(第六版)》

2024年1月24日&#xff0c; FreeBuf咨询正式发布《CCSIP 2023中国网络安全行业全景册(第六版)》。本次发布的全景图&#xff0c;共计展示20个一级分类、108个细分安全领域&#xff0c;旨在为广大企业提供网络安全产品选型参考&#xff0c;帮助企业了解中国网络安全技术与市场的…

C++11——新的类功能与可变参数模板

系列文章目录 文章目录 系列文章目录一、新的类功能默认成员函数类成员变量初始化强制生成默认函数的关键字default禁止生成默认函数的关键字delete继承和多态中的final与override关键字 二、可变参数模板递归函数方式展开参数包逗号表达式展开参数包STL容器中的empalce_back与…

100天精通鸿蒙从入门到跳槽——第20天:ArkTS装饰器@Link双向数据绑定

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》 — Go语言学习之旅!《100天精通鸿蒙》 — 从Web/安卓到鸿蒙大师!100天…

免费分享一套微信小程序外卖跑腿点餐(订餐)系统(uni-app+SpringBoot后端+Vue管理端技术实现) ,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序外卖跑腿点餐(订餐)系统(uni-appSpringBoot后端Vue管理端技术实现) &#xff0c;分享下哈。 项目视频演示 【免费】微信小程序外卖跑腿点餐(订餐)系统(uni-appSpringBoot后端Vue管理端技术实现)…

【开源】基于JAVA语言的毕业生追踪系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登陆注册模块2.2 学生基本配置模块2.3 就业状况模块2.4 学历深造模块2.5 信息汇总分析模块2.6 校友论坛模块 三、系统设计3.1 用例设计3.2 实体设计 四、系统展示五、核心代码5.1 查询我的就业状况5.2 初始化就业状况5.…

SSL加密证书免费申请

首先&#xff0c;让我们来了解一下SSL证书的基本作用。SSL证书通过公钥和私钥的非对称加密技术&#xff0c;使得服务器与浏览器之间的通信内容得到高强度加密&#xff0c;同时验证网站的真实身份&#xff0c;从而提升用户的信任度&#xff0c;也是搜索引擎排名优化的一个重要因…

Idea设置代理后无法clone git项目

背景 对于我们程序员来说&#xff0c;经常上github找项目、找资料是必不可少的&#xff0c;但是一些原因&#xff0c;我们访问的时候速度特别的慢&#xff0c;需要有个代理&#xff0c;才能正常的访问。 今天碰到个问题&#xff0c;使用idea工具 clone项目&#xff0c;速度特…

2.【Vue3】Vue 基本使用——局部使用Vue

文章目录 1. 快速入门2. 常用指令2.1 v-for2.2 v-bind2.3 v-if 与 v-show2.4 v-on2.5 v-model 3. 生命周期4. Ajax 函数库 Axios4.1 Axios 基本使用4.2 Axios 请求方式别名 1. 快速入门 现在需要将 “hello vue3” 这样一个字符串渲染到页面上进行展示。 这个需求并不陌生&…

Vue-Cli3 - 从安装 nodejs 配置环境 ~ 搭建 cli 脚手架项目全过程

目录 前言提示 一、安装 & 配置 nodejs 1.1、安装 nodejs 1.2、配置必要目录 1.3、配置环境变量 1.4、测试 安装&配置 是否成功 1.5、安装淘宝镜像 1.5、cnpm 安装&#xff08;推荐安装&#xff09; 二、vue-cli3 创建项目 2.1、vue-cli2 和 vue-cli3 主要区…

C语言——N / 自定义类型:联合和枚举

目录 一、联合体 1、联合体类型的声明 2、联合体的特点 3、相同成员的结构体和联合体对比 4、联合体大小的计算 5、联合的一个练习 二、枚举类型 1、枚举类型的声明 2、枚举类型的优点 3、枚举类型的使用 一、联合体 1、联合体类型的声明 像结构体⼀样&#xff0c;…

批量导出域控用户及其所在OU和组

在Windows域环境中&#xff0c;批量导出域控用户及其所在OU&#xff08;组织单位&#xff09;和组成员身份信息&#xff0c;可以使用PowerShell脚本实现。以下是一个基本的示例脚本&#xff1a; Import-Module ActiveDirectory# 遍历所有用户 Get-ADUser -Filter * -Propertie…

GitLab16.8配置webhooks、Jenkins2.4配置GitLab插件实现持续集成、配置宝塔面板实现持续部署(其三)

看本篇文章的前提是已经部署完GItlab和Jenkins服务器&#xff0c;已经可以手动构建成功&#xff0c;并且经过了很多次实践&#xff0c;对这两款软件基本熟悉。 建议大家按以下顺序看 前端自动化&#xff08;其一&#xff09;部署gitlab 前端自动化&#xff08;其二&#xff0…

05.领域驱动设计:认识领域事件,解耦微服务的关键

目录 1、概述 2、领域事件 2.1 如何识别领域事件 1.微服务内的领域事件 2.微服务之间的领域事件 3、领域事件总体架构 3.1 事件构建和发布 3.2 事件数据持久化 3.3 事件总线 (EventBus) 3.4 消息中间件 3.5 事件接收和处理 4、案例 5、总结 1、概述 在事件风暴&a…

Qlik Sense : IntervalMatch(离散匹配)

什么是IntervalMatch IntervalMatch 前缀用于创建表格以便将离散数值与一个或多个数值间隔进行匹配&#xff0c;并且任选匹配一个或多个额外关键值。 语法&#xff1a; IntervalMatch (matchfield)(loadstatement | selectstatement ) IntervalMatch (matchfield,keyfield…

百川智能发布超千亿大模型Baichuan 3

1月29日&#xff0c;百川智能发布超千亿参数的大语言模型Baichuan 3。在多个权威通用能力评测如CMMLU、GAOKAO和AGI-Eval中&#xff0c;Baichuan 3都展现了出色的能力&#xff0c;尤其在中文任务上更是超越了GPT-4。而在数学和代码专项评测如MATH、HumanEval和MBPP中同样表现出…

【Delphi】系统菜单中增加菜单项

目录 一、问题提出 二、程序截图 ​编辑 ​编辑 三、程序代码&#xff1a; 一、问题提出 我们在开发windows程序的时候&#xff0c;可能会希望在窗体的系统菜单中增加一个菜单项&#xff0c;那么如何实现呢&#xff0c;实际上通过调用windows API是可以实现的&#xff0c;…

go学习之air库的使用

首先下载air库 go install github.com/cosmtrek/air之后你需要去找到库下载的地方&#xff0c;若使用的是go mod可以使用命令 go env GOPATH找到下载库的位置 进入后&#xff0c;有bin&#xff0c;pkg目录&#xff0c;进入bin目录&#xff0c;你能看到air.exe文件 这时候将此…

备战蓝桥杯---二分(入门)

话不多说&#xff0c;先来个模板题来回顾一下上次讲的&#xff1a; 下面是AC代码&#xff1a; 下面进入正题&#xff1a; 本题对1&#xff0c;2行与3&#xff0c;4行组合&#xff0c;再用二分查找即可实现n^2logn的复杂度。 下面是AC代码&#xff1a; 接题&#xff1a; 让我们…

iOS 闭包和Block的区别

iOS 闭包和Block的区别 原文地址: mob64ca12eb7baf 引言 在iOS开发中&#xff0c;闭包和Block是两个常用的概念。它们都是将一段代码作为变量传递和使用的方式。尽管它们在实现上有一些相似之处&#xff0c;但它们之间还是存在一些重要的区别。本文将会详细介绍闭包和Block的…

leetcode 栈和队列相关题目

题目及题解 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a;https://leetcode.cn/problems/implement-queue-using-stacks/solutions/2614065/s2kong-shi-cai-ba-quan-bu-de-s1pushjin-q-8xv2 225. 用队列实现栈 - 力扣&#xff08;LeetCode&am…