这里使用的是开源框架Android-skin-loader。这个框架已经停止维护了,能满足基本功能需求。
基础使用
添加依赖
将这个库的lib作为module导入,这样方便你根据自己的需求去添加一些功能。
使用
- 继承BaseActivity或者BaseFragmentActivity或者BaseFragment
- 在Application中初始化
public class YourApplication extends Application {
public void onCreate() {
super.onCreate();
// Must call init first
SkinManager.getInstance().init(this);
SkinManager.getInstance().load();
}
}
- 在布局中标识需要换肤的view
//命名空间
xmlns:skin="http://schemas.android.com/android/skin"
<TextView
skin:enable="true"
/>
- 从已生成的皮肤文件中设置皮肤
File skin = new File("skin path");
SkinManager.getInstance().load(skin.getAbsolutePath(),
new ILoaderListener() {
@Override
public void onStart() {
}
@Override
public void onSuccess() {
}
@Override
public void onFailed() {
}
});
生成皮肤文件
生成皮肤文件apk
创建一个App module(记住不是library module)。这个module不需要java文件,可以直接将module_name/src/main/java目录删除。然后在res目录下添加你需要更换的资源文件。记住:需要更换的资源文件必须和主module中的资源文件名字保持一致。
然后直接打包生成apk文件。
复制到主module
将apk文件复制到主module的某个目录下,比如main_module/src/main/assets目录。
更改皮肤文件后缀名
为了防止皮肤文件被用户点击安装,可以将文件后缀改成.skin。或者你自定义一个后缀名。
生成多个皮肤文件
要生成多个皮肤文件,直接在gradle做配置,而无需创建多个module。在skin_module/src目录下创建不同种类的皮肤文件目录,与main同级。这样就可以编译生成不同皮肤的apk。
- 添加buildType
android {
buildTypes{
bmw {
}
benz {
}
toyota {
}
}
}
- 自定义task 自定义一个task,通过获取buildTypes来生成对应的文件夹。
task createAllBuildTypeChildDir() {
//遍历main/res下的子目录,然后为不同的buildType生成对应的目录。这里要使用project.rootDir来表示根目录,这样可以自动适配不同的电脑系统
def file = new File("${project.rootDir}/skin_module/src/main/res")
file.listFiles().each {
childFile ->
def dirName = childFile.name
project.extensions.each {
extension ->
extension.getByName("android").properties.each {
property ->
if (property.key == "buildTypes") {
property.value.each {
value ->
def variantName = value["name"]
if (