Android:换肤框架Android-Skin-Support

news2024/11/24 6:51:42

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

样例:

默认:

更换后:

一、引入依赖:

// -- 换肤依赖
    implementation 'skin.support:skin-support:4.0.5'// skin-support
    implementation '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 {

    @Override
    public 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">
    <gradient
        android: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">

    <!--标题-->
    <TextView
        android: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"/>

    <Button
        android: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="一键换肤(默认颜色)"/>

    <Button
        android: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="一键换肤(红色)"/>


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


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

    }

    /**
     * 点击事件
     * */
    @Override
    public 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
    @Override
    public AppCompatDelegate getDelegate() {
        return SkinAppCompatDelegateImpl.get(this, this);
    }



}

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

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

相关文章

ctf中linux内核态的漏洞挖掘与利用系列(一)

说明 该系列文章主要是从ctf比赛入手&#xff0c;针对linux内核上的漏洞分析、挖掘与利用做讲解&#xff0c;本篇文章主要介绍内核漏洞利用所需的前置知识以及准备工作。 linux内核态与用户态的区别 以 Intel CPU 为例&#xff0c;按照权限级别划分&#xff0c;Intel把 CPU指…

Mysql数据库之单表查询

目录 一、练习时先导入数据如下&#xff1a; 二、查询验证导入是否成功 三、单表查询 四、where和having的区别 一、练习时先导入数据如下&#xff1a; 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 CRE…

umi快速搭建中后台管理系统(命令行创建和区块开发的区别)

后台管理系统 命令行创建新项目命令行效果图配置文件package.json umi3构建区块readme.md主页面页面布局页面布局的一些参数总结 区块开发步骤三级目录 命令行创建新项目 命令行 1、 npm i ant-design/pro-cli -g 2、 pro create demo_spacemv_managementsys 3、 umi 3 simpl…

安防监控小程序商城开发攻略

在当今信息化的时代&#xff0c;安防监控已经成为了人们生活中的重要一环。为了更好地满足人们对于安全的需求&#xff0c;许多企业都开始利用小程序来开展安防监控业务。那么&#xff0c;如何搭建一个安防监控小程序呢&#xff1f;下面我们将一步步来进行介绍。 首先&#xff…

Oracle 开发篇+Java通过共享模式访问Oracle数据库

标签&#xff1a;共享服务器进程、shared server process释义&#xff1a;shared server process是Oracle的一种数据库连接技术&#xff0c;类似的还有专用模式和DRCP ★ 数据库配置 alter system set shared_server_sessions1 scopespfile; alter system set max_shared_serv…

Delphi7通过VB6之COM对象调用PowerBASIC写的DLL功能

Delphi7通过VB6之COM对象调用PowerBASIC写的DLL功能。标题挺长&#xff0c;其实目标很简单&#xff0c;就是在Delphi7中使用PowerBASIC的MKI/CVI, MKS/CVS, MKD/CVD&#xff0c;并顺便加入CRC16检验函数&#xff0c;再进行16进制高低字节调整&#xff0c;方便在VB6、Delphi、La…

基于grpc从零开始搭建一个准生产分布式应用(系列)

花了点时间先把程序代码完全写完了&#xff0c;加了这个章节。因为后续章节是连续的&#xff0c;没有一个总纲同学们难免看的云里雾里的。本章先描述下完整的源码如何运行以及工程的结构。此专题大概由30章组成&#xff0c;真正的从0开始&#xff0c;框架是在原生产环境中抽取的…

【目标检测系列】YOLOV2解读

为更好理解YOLOv2模型&#xff0c;请先移步&#xff0c;了解YOLOv1后才能更好的理解YOLOv2所做的改进。 前情回顾&#xff1a;【目标检测系列】YOLOV1解读_怀逸%的博客-CSDN博客 背景 通用的目标检测应该具备快速、准确且能过识别各种各样的目标的特点。自从引入神经网络以来&a…

at命令 执行一次指定定时任务

简介&#xff1a; at命令 可以设置在一个指定的时间执行一个指定任务&#xff0c;只能执行一次&#xff0c;使用前确认系统开启了atd Service 安装&#xff1a; [rootnode1 ~]# yum -y install at启动&#xff1a; [rootnode1 ~]# systemctl enable atd [rootnode1 ~]# sys…

百望云斩获“2023企业财税服务平台TOP15”奖项

企业服务业务越来越成为企业发展中不可或缺的一部分。 根据权威数据&#xff0c;企业服务的市场规模在过去五年内年均增长率超过15%。这一点&#xff0c;在投融资领域可能表现得更加迅速也更加明显—— 依据IT桔子、烯牛数据的调研&#xff1a;7月份&#xff0c;企服领域投融资…

SonarQube安装与Java、PHP代码质量分析扫描

文章目录 1、下载安装1.1、SonarQube下载1.2、SonarQube安装1.3、SonarQube中文汉化1.4、SonarScanner扫描器 2、扫描项目2.1、java代码扫描2.2、php代码扫描 1、下载安装 SonarQube负责存储代码数据、收集数据、分析代码和生成报告等。 1.1、SonarQube下载 下载地址&#x…

HTML+CSS+JavaScript:渲染电商站购物车页面

一、需求 根据下图渲染购物车页面 二、代码素材 以下是缺失JS部分的代码&#xff0c;感兴趣的小伙伴可以先自己试着写一写 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatib…

木马免杀(篇二)shellcode 学习

木马免杀&#xff08;篇二&#xff09;shellcode 学习 —— shellcode介绍 shellcode 是一段利用软件漏洞进行执行的机器码&#xff0c; 通常用汇编语言编写并被翻译为十六进制操作码&#xff0c;因常被攻击者用于获取系统的命令终端shell 接口&#xff0c;所以被称为 shellc…

NLP语言模型概览

语言模型结构分类 Encoder-Decoder&#xff08;Transformer&#xff09;: Encoder 部分是 Masked Multi-Head Self-Attention&#xff0c;Decoder 部分是 Casual Multi-Head Cross-Attention 和 Casual Multi-Head Self-Attention 兼具。比如T5&#xff0c;BART&#xff0c;MA…

HCIP STP(生成树)

目录 一、STP概述 二、生成树协议原理 三、802.1D生成树 四、STP的配置BPDU 1、配置BPDU的报文格式 2、配置BPDU的工作过程 3、TCN BPDU 4、TCN BPDU的工作过程 五、STP角色选举 1、根网桥选举 2、根端口选举 3、指定端口选举 4、非指定端口选举 六、STP的接口状…

免费思维导图软件有哪些?精选6款免费好用、功能强大的思维导图软件!

相信大家或多或少都听说过思维导图以及它的强大作用&#xff0c;它简单又高效&#xff0c;能够将散点链接成为相关联的、有逻辑的整体&#xff0c;更好地梳理和管理知识。不管你有没有真正体验过思维导图带来的神奇效果&#xff0c;相信你一定也在寻找一款免费好用的思维导图软…

找不到msvcp120dll,无法继续执行代码,怎么解决?

当msvcp120.dll文件丢失或找不到时&#xff0c;会导致无法运行使用C编写的程序。这可能是由于以下原因导致的&#xff1a; 1.删除或移动文件&#xff1a;如果你不小心删除了或移动了msvcp120.dll文件&#xff0c;你将无法找到它并加载它&#xff0c;从而导致程序无法正常运行。…

2023上半年京东奶粉行业品牌销售排行榜(京东数据分析平台)

近年来&#xff0c;受新生儿人口数量下降的影响&#xff0c;婴幼儿奶粉市场的需求量萎缩&#xff0c;市场由增量竞争转为存量竞争。根据鲸参谋电商数据分析平台的数据显示&#xff0c;今年上半年&#xff0c;京东婴幼儿奶粉市场的销量将近4400万&#xff0c;环比下降约19%&…

AtcoderABC224场

A - TiresA - Tires 题目大意 题目要求判断给定字符串S的末尾是以"er"还是"ist"结尾&#xff0c;并输出对应的结果。 思路分析 使用substr函数获取字符串S的末尾2个字符或3个字符。 判断获取到的子字符串是否等于"er"或"ist"&#…

赛事 | 第25届中国机器人及人工智能大赛全国决赛榜单发布

第25届中国机器人及人工智能大赛成功举办 2023年6月13日至14日&#xff0c;第二十五届中国机器人及人工智能大赛于海南科技职业大学成功举办。大赛由中国人工智能学会主办&#xff0c;共有来自清华大学、哈尔滨工业大学、中国科学技术大学、西安交通大学等500多所高校进入全国…