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);}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36339.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36339.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36339.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Rust語法:變量,函數,控制流,struct

文章目錄 變量可變與不可變變量變量與常量變量的Shadowing標量類型整數 復合類型 函數控制流if elseloop & whilefor in structstruct的定義Tuple Structstruct的方法與函數 變量 可變與不可變變量 Rust中使用let來聲明變量&#xff0c;但是let聲明的是不可變變量&#x…

Golang自定義類型與類型別名

type myInt int32 與 type myInt int32&#xff0c;概念并不相同 自定義類型&#xff1a;type myInt int32 通過這種方式定義的類型是一個全新的類型&#xff0c;這個新類型與int32有相同的底層結構&#xff0c;但是卻與int32類型不兼容。 type myInt int32var a int32 5 var…

雙色球彩票系統---(java實現)

雙色球彩票系統&#xff1a;需求&#xff1a;投注號碼由6個紅色號碼和1個藍色球號碼組成。紅色球號碼從1-33中選擇&#xff0c;藍色球號碼從1-16當中選擇 * 紅 藍 * 一等獎 6 1 * 二等獎 6 0 * 三等獎 5 1 * 四等獎 5 0 * 4 1 * 五等獎 4 0 * …

Blazor簡單教程(1.1):Razor基礎語法

文章目錄 前言基本文件配置引入Layout組件 語法介紹pagecodeRazor 語法[ 顯式表達和隱式表達](https://learn.microsoft.com/zh-cn/aspnet/core/mvc/views/razor?viewaspnetcore-7.0#explicit-razor-expressions) 綁定簡單綁定雙向綁定帶參數的函數綁定 依賴注入 前言 Blazor…

synchronized使用

目錄 問題描述 1 鎖方法 2 鎖代碼塊 3 鎖某個類 4 靜態方法上的synchronized 當我們處理多線程處理同步問題的時候就會用到synchronized這個關鍵字&#xff0c;下面介紹下synchronized的四種用法。 問題描述 介紹之前我們先來看下&#xff0c;在java 多線程中 如果沒有線…

leetcode1. 兩數之和

題目&#xff1a;leetcode1. 兩數之和 描述&#xff1a; 給定一個整數數組 nums 和一個整數目標值 target&#xff0c;請你在該數組中找出 和為目標值 target 的那 兩個 整數&#xff0c;并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案。但是&#xff0c;數組中…

QT:UI控件(按設計師界面導航界面排序)

基礎部分 創建新項目&#xff1a;QWidget&#xff0c;QMainWindow&#xff0c;QDialog QMainWindow繼承自QWidget&#xff0c;多了菜單欄; QDialog繼承自QWidget&#xff0c;多了對話框 QMainWindow 菜單欄和工具欄&#xff1a; Bar: 菜單欄&#xff1a;QMenuBar&#xff0…

A Survey for In-context Learning

A Survey for In-context Learning 摘要&#xff1a; 隨著大語言模型(LLMs)能力的增長&#xff0c;上下文學習(ICL)已經成為一個NLP新的范式&#xff0c;因為LLMs僅基于幾個訓練樣本讓內容本身增強。現在已經成為一個新的趨勢去探索ICL來評價和extrapolate LLMs的能力。在這篇…

微服務06-分布式事務解決方案Seata

1、Seata 概述 Seata事務管理中有三個重要的角色: TC (Transaction Coordinator) - **事務協調者:**維護全局和分支事務的狀態,協調全局事務提交或回滾。 TM (Transaction Manager) - **事務管理器:**定義全局事務的范圍、開始全局事務、提交或回滾全局事務。 RM (Resourc…

Java地圖專題課 基本API BMapGLLib 地圖找房案例 MongoDB

本課程基于百度地圖技術&#xff0c;由基礎入門開始到應用實戰&#xff0c;適合零基礎入門學習。將企業項目中地圖相關常見應用場景的落地實戰&#xff0c;包括有地圖找房、輕騎小程序、金運物流等。同時講了基于Netty實現高性能的web服務&#xff0c;來處理高并發的問題。還講…

ttf-dejavu fontconfig字體

ttf-dejavu fontconfig是驗證碼&#xff0c;pdf&#xff0c;excel時需要用到的字體 編輯dockerfile&#xff0c;先切換國內鏡像源&#xff0c;默認alpinelinux是國外源&#xff0c;下載包會很慢 vim Dockerfile FROM alpine:latest RUN sed -i s/dl-cdn.alpinelinux.org/mirr…

【創建型設計模式】C#設計模式之原型模式

原型模式是一種創建型設計模式&#xff0c;它通過復制現有對象來創建新對象&#xff0c;而無需通過實例化的方式。它允許我們使用已經存在的對象作為藍本&#xff0c;從而創建新的對象&#xff0c;這樣可以避免重復初始化相似的對象&#xff0c;提高了對象的創建效率。 現在給…

Sentinel

1、熔斷降級限流 熔斷 A服務調用B服務的某個功能&#xff0c;由于網絡不穩定、B服務卡機等問題&#xff0c;導致功能時間超長。如果這樣子的次數太多&#xff0c;我們就可以直接將B斷路&#xff08;A不再請求B接口&#xff09;&#xff0c;凡是調用B服務的直接返回降級數據&a…

13-數據結構-串以及KMP算法,next數組

串 目錄 串 一、串&#xff1a; 二、串的存儲結構&#xff1a; 三、模式匹配 1.簡單模式匹配&#xff08;BF算法&#xff09; 2.KMP算法 2.1-next&#xff08;j&#xff09;數組手工求解 2.2-nextval&#xff08;j&#xff09;數組手工求解 一、串&#xff1a; 內容受…

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

JVM垃圾回收篇-垃圾回收算法 標記清除&#xff08;Mark Sweep&#xff09; 概念 collector指的就是垃圾收集器。 mutator是指除了垃圾收集器之外的部分&#xff0c;比如說我們的應用程序本身。 mutator的職責一般是NEW(分配內存)、READ(從內存中讀取內容)、WRITE(將內容寫入內…

將多個單獨的 Excel 文件合并成一個,并添加標題行

要將多個單獨的 Excel 文件合并成一個&#xff0c;并添加標題行&#xff0c;可以使用 Python 的 pandas 庫。以下是一個示例代碼&#xff0c;假設要合并的 Excel 文件都在同一個文件夾中&#xff1a; import os import pandas as pd # 指定文件夾路徑 folder_path path/to/fo…

vscode搭建c語言環境問題

c語言環境搭建參考文章:【C語言初級階段學習1】使用vscode運行C語言&#xff0c;vscode配置環境超詳細過程&#xff08;包括安裝vscode和MinGW-W64安裝及后續配置使用的詳細過程&#xff0c;vscode用戶代碼片段的使用&#xff09;[考研專用]_QAQshift的博客-CSDN博客 問題如下:…

[C++ 網絡協議] 套接字和地址族、數據序列

目錄 1. 套接字 1.1 在Linux平臺下構建套接字 1.1.1 用于接聽的套接字(服務器端套接字) 1.1.2 用于發送請求的套接字(客戶端套接字) 1.2 在Windows平臺下構建套接字 1.2.1 Winsock的初始化 1.2.2 用于接聽的套接字(服務器端套接字) 1.2.3 用于發送請求的套接字(客戶端套…

pytest框架快速進階篇-pytest前置和pytest后置,skipif跳過用例

一、Pytest的前置和后置方法 1.Pytest可以集成unittest實現前置和后置 importunittestimportpytestclassTestCase(unittest.TestCase):defsetUp(self)->None:print(unittest每個用例前置)deftearDown(self)->None:print(unittest每個用例后置)classmethoddefsetUpClass…

jmeter中用戶參數和用戶定義的變量的區別

如果使用jmeter做過參數化的人都知道&#xff0c;參數化的方式有多種&#xff0c;其中一種就是使用用戶定義的變量&#xff0c;還有一種是使用用戶參數。那么&#xff0c;這兩個有什么異同呢&#xff1f; 一、先說相同的點&#xff1a; 1、都可以參數化&#xff0c;以供sample…