# Android主题换肤 **Repository Path**: kuiyun/androidzhutihuanfu ## Basic Information - **Project Name**: Android主题换肤 - **Description**: 仿网易云 - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2017-07-04 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ##Android-skin-support ## 介绍 Android-skin-support: 一款用心去做的Android 换肤框架, 极低的学习成本, 极好的用户体验. 只需要两行代码, 就可以实现换肤, 你值得拥有!!! 第一行: 在Application的onCreate中初始化 ```java SkinCompatManager.init(this).loadSkin(); ``` 第二行: 继承自SkinCompatActivity ```java public class BaseActivity extends SkinCompatActivity {} ``` 就这么简单, 你的APK已经拥有了强大的换肤功能. [skin-app](skin-app) // 换肤demo app [skin-night](skin-night) // 换肤demo 夜间模式 [skin-support](skin-support) // 换肤框架, 基础控件支持 [skin-support-design](skin-support-design) // 换肤框架, Material Design 支持 ## 用法 ### 导入: 直接添加依赖, [最新版本选择, 请查看更新日志](ChangeLog.md) ```xml compile 'skin.support:skin-support:1.2.8'       // skin-support 基础控件支持 compile 'skin.support:skin-support-design:1.2.4' // skin-support-design material design 控件支持[可选] compile 'skin.support:skin-support-cardview:1.2.0' // skin-support-cardview CardView 控件支持[可选] ``` ### 使用: #### 在Application的onCreate中初始化 ```java @Override public void onCreate() { super.onCreate();    SkinCompatManager.init(this) // 基础控件换肤初始化 .addInflater(new SkinMaterialViewInflater()) // material design 控件换肤初始化[可选] .addInflater(new SkinCardViewInflater()) // CardView 控件换肤初始化[可选] .loadSkin(); // 加载当前皮肤库(保存在SharedPreferences中) } ``` 或者 ```java @Override public void onCreate() { super.onCreate(); SkinMaterialManager.init(this); // material design 控件换肤初始化[可选] SkinCardViewManager.init(this); // CardView 控件换肤初始化[可选]    SkinCompatManager.init(this).loadSkin(); // 基础控件换肤初始化并加载当前皮肤库(保存在SharedPreferences中) } ``` #### 继承SkinCompatActivity 让所有需要换肤的Activity继承自`skin.support.app.SkinCompatActivity`. *如果有特殊需求, 无法继承自SkinCompatActivity, 可以将SkinCompatActivity中的实现移到自己的BaseActivity中.* ```java public class BaseActivity extends SkinCompatActivity {} ``` #### 皮肤开关 如果项目中有特殊需求。例如, 股票控件: 控件颜色始终为红色或绿色, 不需要随着模式切换而换肤 那么可以使用类似的方法, 直接设置color值 ```xml setTextColor(0xce3d3a) // 不支持换肤 textColor="#ce3d3a" ``` 而不是使用R.color.red ```xml setTextColor(R.color.red) textColor="@color/red" ``` #### 加载插件皮肤库 ```java // 指定皮肤插件 SkinCompatManager.getInstance().loadSkin("new.skin"[, SkinLoaderListener]); // 恢复应用默认皮肤 SkinCompatManager.getInstance().restoreDefaultTheme(); ``` #### 自定义View换肤 要点: 1. 实现SkinCompatSupportable接口 1. applySkin方法中实现换肤操作 2. 在构造方法中解析出需要换肤的resId * 自定义View可以直接继承自SkinCompatView, SkinCompatLinearLayout等已有控件 eg: [CustomTextView](skin-app/src/main/java/com/ximsfei/dynamicskindemo/widget/CustomTextView.java) * 不想继承自已有控件 eg: [CustomTextView2](skin-app/src/main/java/com/ximsfei/dynamicskindemo/widget/CustomTextView2.java) * 需要换肤自定义属性 // 需要换肤AutoCompleteTextView的R.attr.popupBackground属性 eg: [SkinCompatAutoCompleteTextView](skin-support/src/main/java/skin/support/widget/SkinCompatAutoCompleteTextView.java) * 需要使用第三方库控件怎么办 // 需要使用https://github.com/hdodenhof/CircleImageView 控件, 并且要支持换肤 eg: [SkinCompatCircleImageView](third-part-support/circleimageview) ### 制作皮肤插件: #### 新建Android application工程 皮肤工程包名不能和宿主应用包名相同. 例如: ```xml 宿主包名: com.ximsfei.skindemo 夜间模式: com.ximsfei.skindemo.night ``` #### 将需要换肤的资源放到res目录下(同名资源) 例如 APK中窗口背景颜色为 colors.xml ```xml #ffffff ``` 那么夜间模式你可以在skin-night工程中设置 colors.xml ```xml #000000 ``` #### 打包生成apk, 即为皮肤包 将打包生成的apk文件, 重命名为'xxx.skin', 防止apk结尾的文件造成混淆.