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

Android:换肤框架Android-Skin-Support

gihub地址:https://github.com/ximsfei/Android-skin-support

样例:

默认:

更换后:

一、引入依赖:

// -- 换肤依赖implementation 'skin.support:skin-support:4.0.5'// skin-supportimplementation 'skin.support:skin-support-appcompat:4.0.5'// skin-support 基础控件支持implementation 'skin.support:skin-support-design:4.0.5'// skin-support-design material design 控件支持[可选]implementation 'skin.support:skin-support-cardview:4.0.5'// skin-support-cardview CardView 控件支持[可选]implementation 'skin.support:skin-support-constraint-layout:4.0.5'// skin-support-constraint-layout ConstraintLayout 控件支持[可选]

二、创建MyApplication:

public class Myapplication extends Application {@Overridepublic void onCreate() {super.onCreate();SkinCompatManager.withoutActivity(this).addInflater(new SkinAppCompatViewInflater())           // 基础控件换肤初始化.addInflater(new SkinMaterialViewInflater())            // material design 控件换肤初始化[可选].addInflater(new SkinConstraintViewInflater())          // ConstraintLayout 控件换肤初始化[可选].addInflater(new SkinCardViewInflater())                // CardView v7 控件换肤初始化[可选].setSkinStatusBarColorEnable(false)                     // 关闭状态栏换肤,默认打开[可选].setSkinWindowBackgroundEnable(false)                   // 关闭windowBackground换肤,默认打开[可选].loadSkin();}}

AndroidManifest.xml配置MyApplication.java:

三、创建需要换肤的资源

 

(1)选中main -> 右键New->Directory 创建res-后缀名

 (2)res-后缀名资源文件下创建对应的drawable、values等资源文件,如下图所示

以res-red资源为例:

shape_my_info_bg_red.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><gradientandroid:angle="90"android:endColor="#E91E63"android:startColor="#70E91E63" />
</shape>

 colors.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources><color name="skin_topbar_text_color_red">#860F08</color><color name="skin_button_color_red">#CA493F</color>
</resources>

四、初始布局使用默认res文件下资源

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:background="@drawable/shape_my_info_bg"tools:context=".MainActivity"><!--标题--><TextViewandroid:id="@+id/topBarTv"android:layout_width="match_parent"android:layout_height="60dp"android:gravity="center"android:textStyle="bold"android:textSize="20sp"android:text="标题信息"android:textColor="@color/skin_topbar_text_color"/><Buttonandroid:id="@+id/changeBtn"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="20dp"android:background="@drawable/shape_my_info_bg"android:textStyle="bold"android:textColor="@color/skin_button_color"android:text="一键换肤(默认颜色)"/><Buttonandroid:id="@+id/changeRedBtn"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="20dp"android:background="@drawable/shape_my_info_bg"android:textStyle="bold"android:textColor="@color/skin_button_color"android:text="一键换肤(红色)"/><Buttonandroid:id="@+id/changeYellowBtn"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="20dp"android:background="@drawable/shape_my_info_bg"android:textStyle="bold"android:textColor="@color/skin_button_color"android:text="一键换肤(黄色)"/></LinearLayout>

五、使用

public class MainActivity extends AppCompatActivity implements View.OnClickListener{// 换肤按钮// 默认皮肤private Button changeBtn;// 红色皮肤private Button changeRedBtn;// 黄色皮肤private Button changeYellowBtn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initControls();}// 控件初始化private void initControls(){// 默认颜色changeBtn = findViewById(R.id.changeBtn);changeBtn.setOnClickListener(this);// 红色changeRedBtn = findViewById(R.id.changeRedBtn);changeRedBtn.setOnClickListener(this);// 黄色changeYellowBtn = findViewById(R.id.changeYellowBtn);changeYellowBtn.setOnClickListener(this);}/*** 点击事件* */@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.changeBtn:// 默认颜色// 恢复默认皮肤SkinCompatManager.getInstance().restoreDefaultTheme();break;case R.id.changeRedBtn:// 红色// 前缀加载//SkinCompatManager.getInstance().loadSkin("light", SkinCompatManager.SKIN_LOADER_STRATEGY_PREFIX_BUILD_IN);// 后缀加载SkinCompatManager.getInstance().loadSkin("red", null,SkinCompatManager.SKIN_LOADER_STRATEGY_BUILD_IN);break;case R.id.changeYellowBtn:// 黄色// 前缀加载//SkinCompatManager.getInstance().loadSkin("light", SkinCompatManager.SKIN_LOADER_STRATEGY_PREFIX_BUILD_IN);// 后缀加载SkinCompatManager.getInstance().loadSkin("yellow", null,SkinCompatManager.SKIN_LOADER_STRATEGY_BUILD_IN);break;}}/*** 如果项目中使用的Activity继承自AppCompatActivity,需要重载getDelegate()方法* */@NonNull@Overridepublic AppCompatDelegate getDelegate() {return SkinAppCompatDelegateImpl.get(this, this);}}

相关文章:

Android:换肤框架Android-Skin-Support

gihub地址&#xff1a;https://github.com/ximsfei/Android-skin-support 样例&#xff1a; 默认&#xff1a; 更换后&#xff1a; 一、引入依赖&#xff1a; // -- 换肤依赖implementation skin.support:skin-support:4.0.5// skin-supportimplementation skin.support:ski…...

软件测试面试心得:四种公司、四种问题…

以下是我个人总结的一些经验&#xff1a; 传统开发模式&#xff1a;&#xff36;模式&#xff0c;瀑布模式。传统开发模式往往循规蹈矩&#xff0c;从需求&#xff0c;概要设计&#xff0c;详细设计&#xff0c;开发&#xff0c;单元测试&#xff0c;集成测试&#xff0c;系统测…...

【探索SpringCloud】服务发现-Nacos使用

前言 在聊服务注册中心时&#xff0c;便提到了Nacos。这次便来认识一下。当然&#xff0c;这自然没有官方介绍那般详尽&#xff0c;权当是学习了解Nacos原理的一个过程吧。 Nacos简介 Nacos&#xff0c;全名&#xff1a;dynamic Naming And Configuration Service. 而这个名…...

soap通信2

首先&#xff0c;定义一个XSD&#xff08;XML Schema Definition&#xff09;来描述你的数据结构。在你的Maven项目的src/main/resources目录下&#xff0c;创建一个名为schemas的文件夹&#xff0c;并在其中创建一个名为scriptService.xsd的文件&#xff0c;内容如下&#xff…...

【MySQL】MySQL不走索引的情况分析

未建立索引 当数据表没有设计相关索引时&#xff0c;查询会扫描全表。 create table test_temp (test_id int auto_incrementprimary key,field_1 varchar(20) null,field_2 varchar(20) null,field_3 bigint null,create_date date null );expl…...

JVM垃圾回收篇-垃圾回收算法

JVM垃圾回收篇-垃圾回收算法 标记清除&#xff08;Mark Sweep&#xff09; 概念 collector指的就是垃圾收集器。 mutator是指除了垃圾收集器之外的部分&#xff0c;比如说我们的应用程序本身。 mutator的职责一般是NEW(分配内存)、READ(从内存中读取内容)、WRITE(将内容写入内…...

android APP内存优化

Android为每个应用分配多少内存 Android出厂后&#xff0c;java虚拟机对单个应用的最大内存分配就确定下来了&#xff0c;超出这个值就会OOM。这个属性值是定义在/system/build.prop文件中. 例如&#xff0c;如下参数 dalvik.vm.heapstartsize8m #起始分配内存 dalvik.vm.…...

mysql_docker主从复制_实战_binlog混合模式_天座著

步骤1&#xff1a;拉取镜像 docker pull mariadb:latest 步骤2.1&#xff1a;创建两个文件夹用于放置挂载mysql的my.cnf /tianzuomysqlconf/master /tianzuomysqlconf/slave mkdir /tianzuomysqlconf cd /tianzuomysqlconf mkdir master mkdir slave 步骤2.2&#xff1a;创…...

鸿蒙开发学习笔记1——真机运行hello world

问题背景 学习任何语言和框架的第一步&#xff0c;永远都是跑通熟悉的“hello world”&#xff0c;本文将介绍鸿蒙开发如何跑通“hello world”。 问题分析 一、构建第一个ArkTS应用&#xff08;fa模型&#xff09; 说明&#xff1a;请使用DevEco Studio V3.0.0.601 Beta1及…...

Java数组,简简单单信手沾来~

——数组&#xff0c;一组相同数据类型的数据 一.一维数组 1.数组的基本概念 1&#xff09;数组用于存储多个同一数据类型的数据 2&#xff09;数组是数据类型【引用类型】 3&#xff09;数组的形式&#xff1a;数据类型 [] 4&#xff09;数组的下标从0开始 5&#xff09;数…...

认识SourceTree

一. SourceTree是什么 SourceTree是一款免费的Git和Mercurial版本控制系统&#xff0c;它可以帮助开发人员在一个友好的UI界面中管理代码&#xff0c;方便地进行版本控制和代码同步。支持创建、克隆、提交、push、pull 和合并等操作。 二. SourceTree的安装破解 1. 如果你还…...

python之列表推导式

列表推导式是一种简洁的方式来创建列表。它允许您通过在单个表达式中定义循环和条件逻辑&#xff0c;以一种更紧凑的方式生成新的列表。使用列表推导式可以使代码更简洁&#xff0c;易于阅读&#xff0c;并且通常比传统的迭代方法更快。 列表推导式的一般语法形式为&#xff1a…...

selenium自动化测试之搭建测试环境

自动化测试环境&#xff1a; Python3.7Selenium3.141谷歌浏览器76.0/火狐浏览器 1、安装Python并配置环境变量。 下载并安装&#xff1a;配置环境变量&#xff1a;C:\Python37;C:\Python37\Scripts; 2、安装Pycharm开发工具。 下载地址&#xff1a; 注意下载&#xff1a;Co…...

模拟实现消息队列(以 RabbitMQ 为蓝本)

目录 1. 需求分析1.1 介绍一些核心概念核心概念1核心概念2 1.2 消息队列服务器&#xff08;Broker Server&#xff09;要提供的核心 API1.3 交换机类型1.3.1 类型介绍1.3.2 转发规则&#xff1a; 1.4 持久化1.5 关于网络通信1.5.1 客户端与服务器提供的对应方法1.5.2 客户端额外…...

WordPress更换域名后-后台无法进入,网站模版错乱,css失效,网页中图片不显示。完整解决方案(含宝塔设置)

我在实际解决问题时用到了 【简单暴力解决方案】的《方法一:修改wp-config.php》 和 【简单暴力-且特别粗暴-的解决方案】 更换域名时经常遇到的几个问题: 1、更换域名后,后台无法进入 2、更换域名后,网站模版错乱,css失效 3、更换域名后,网页中图片不显示 这是为什…...

无法正确识别车牌(Python、OpenCv、Tesseract)

我正在尝试识别车牌&#xff0c;但出现了错误&#xff0c;例如错误/未读取字符 以下是每个步骤的可视化&#xff1a; 从颜色阈值变形关闭获得遮罩 以绿色突出显示的车牌轮廓过滤器 将板轮廓粘贴到空白遮罩上 Tesseract OCR的预期结果 BP 1309 GD 但我得到的结果是 BP 1309…...

VSCODE[配置ssh免密远程登录]

配置ssh免密远程登录 本文摘录于&#xff1a;https://blog.csdn.net/qq_44571245/article/details/123031276只是做学习备份之用&#xff0c;绝无抄袭之意&#xff0c;有疑惑请联系本人&#xff01; 这里要注意如下几个地方: 1.要进入.ssh目录创建文件: 2.是拷贝带"ssh-…...

Multi-object navigation in real environments using hybrid policies 论文阅读

论文信息 题目&#xff1a;Multi-object navigation in real environments using hybrid policies 作者&#xff1a;Assem Sadek, Guillaume Bono 来源&#xff1a;CVPR 时间&#xff1a;2023 Abstract 机器人技术中的导航问题通常是通过 SLAM 和规划的结合来解决的。 最近…...

初始多线程

目录 认识线程 线程是什么&#xff1a; 线程与进程的区别 Java中的线程和操作系统线程的关系 创建线程 继承Thread类 实现Runnable接口 其他变形 Thread类及其常见方法 Thread的常见构造方法 Thread类的几个常见属性 Thread类常用的方法 启动一个线程-start() 中断…...

论坛项目day3|开发社区首页

在典型的基于层次结构的软件架构中&#xff0c;特别是在使用MVC&#xff08;模型-视图-控制器&#xff09;设计模式的情况下&#xff0c;Controller、Service、DAO&#xff08;数据访问对象&#xff09;和Entity通常扮演着不同的角色&#xff0c;并且它们之间有清晰定义的关系。…...

别再只ping了!用Kali的arpspoof工具,5分钟让你看懂局域网ARP攻击到底怎么断网的

从ARP协议到断网攻击&#xff1a;用Kali的arpspoof工具揭示局域网安全漏洞 你是否遇到过这样的情况——明明Wi-Fi信号满格&#xff0c;却突然无法上网&#xff1f;或者发现网络时断时续&#xff0c;怀疑有人在"搞鬼"&#xff1f;这很可能就是遭遇了ARP欺骗攻击。今天…...

VideoDownloadHelper终极解决方案:让网络视频下载效率提升300%的神器

VideoDownloadHelper终极解决方案&#xff1a;让网络视频下载效率提升300%的神器 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 您是否还在为…...

Lite-Avatar与ChatGPT结合的智能对话系统实现

Lite-Avatar与ChatGPT结合的智能对话系统实现 1. 引言 想象一下&#xff0c;你正在和一个数字人进行视频对话&#xff0c;它不仅能够听懂你的问题&#xff0c;还能用生动的表情和自然的语气回答你&#xff0c;就像和一个真人交流一样。这种体验现在已经不再是科幻电影里的场景…...

技术揭秘:SMUDebugTool如何实现AMD Ryzen处理器的深度硬件调试

技术揭秘&#xff1a;SMUDebugTool如何实现AMD Ryzen处理器的深度硬件调试 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: ht…...

MelonLoader终极指南:解锁Unity游戏的双引擎插件加载能力

MelonLoader终极指南&#xff1a;解锁Unity游戏的双引擎插件加载能力 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader MelonLoad…...

反激式开关电源双环PID控制避坑指南:从理论到MATLAB仿真

反激式开关电源双环PID控制避坑指南&#xff1a;从理论到MATLAB仿真 反激式开关电源因其结构简单、成本低廉等优势&#xff0c;在中小功率场合广泛应用。然而&#xff0c;其控制系统的设计却暗藏诸多陷阱&#xff0c;尤其是电压环与电流环的双环PID控制&#xff0c;稍有不慎就会…...

PowerPaint-V1 Gradio在文化遗产保护中的应用:古画修复与数字化

PowerPaint-V1 Gradio在文化遗产保护中的应用&#xff1a;古画修复与数字化 1. 引言 一幅珍贵的古代山水画&#xff0c;因为年代久远出现了多处破损和褪色&#xff1b;一张历史照片&#xff0c;因为保存不当而出现了霉斑和裂纹。这些文化遗产的损坏&#xff0c;往往意味着一段…...

深入解析Android Verified Boot (AVB):从启动链到镜像验证的完整机制

1. Android Verified Boot (AVB) 是什么&#xff1f; 当你按下手机电源键时&#xff0c;系统会经历一系列复杂的启动过程。AVB&#xff08;Android Verified Boot&#xff09;就是在这个过程中确保每一步加载的代码都未被篡改的安全卫士。想象一下&#xff0c;这就像机场的安检…...

Linux操作系统进程(下)

Linux操作系统进程(下) 深入理解进程概念&#xff0c;了解PCB学习进程状态&#xff0c;创建进程&#xff0c;掌握僵尸进程和孤儿进程的形成和危害了解进程的调度&#xff0c;Linux进程优先级&#xff0c;理解进程竞争性与独立性 文章目录Linux操作系统进程(下)进程和PCB进程概…...

Architect.dev核心组件架构揭秘:深入理解@http、@tables、@events

Architect.dev核心组件架构揭秘&#xff1a;深入理解http、tables、events 【免费下载链接】architect The simplest, most powerful way to build a functional web app (fwa) 项目地址: https://gitcode.com/gh_mirrors/ar/architect Architect.dev 是一个革命性的无服…...