Android一键换肤功能实现及实现过程中Glide图片显示问题
因为时间紧,任务急,工程量可能会大,使用的换肤框架是
https://github.com/burgessjp/ThemeSkinning 这个,代码嵌入量少,集成进去也简单,作为新手,可以把demo运行起来,多点几下,就差不多了。
场景
因为在我的项目中是需要把状态栏,主页底部Tab页的资源文件,还有其他页面的资源文件都需要替换掉,所以,相对于白天黑夜模式的换肤,工程量可能会多一些。
集成步骤
- 添加依赖 compile ‘com.solid.skin
latestVersion’
- 让你的 Application 继承于 SkinBaseApplication
- 让你的 Activity 继承于 SkinBaseActivity,如果使用了 Fragment 则继承于 SkinBaseFragment
- 在需要换肤的根布局上添加 xmlns:skin=“http://schemas.android.com/android/skin” ,然后在需要换肤的View上加上 skin:enable=“true”
- 新建一个项目模块(只包含有资源文件,例如本项目的 skinpackage 模块),其中包含的资源文件的 name 一定要和原项目中有换肤需求的 View 所使用的资源name一致。
- 拿到上一步生成的文件( ×××.apk ),改名为 ×××.skin,放入 assets 中的 skin 目录下( skin 目录是自己新建的)
在合适的地方调用换肤
SkinManager.getInstance().loadSkin(“theme-20171126.skin”,
new SkinLoaderListener() {
@Override
public void onStart() {
Log.i("SkinLoaderListener", "正在切换中");
//dialog.show();
}
@Override
public void onSuccess() {
Log.i("SkinLoaderListener", "切换成功");
}
@Override
public void onFailed(String errMsg) {
Log.i("SkinLoaderListener", "切换失败:" + errMsg);
}
@Override
public void onProgress(int progress) {
Log.i("SkinLoaderListener", "皮肤文件下载中:" + progress);
}
}
);
一些重要的API
SkinConfig.isDefaultSkin(context):判断当前皮肤是否是默认皮肤
SkinManager.getInstance().restoreDefaultTheme(): 重置默认皮肤
dynamicAddView:当动态创建的View也需要换肤的时候,就可以调用 dynamicAddView
还是建议使用下 https://github.com/burgessjp/ThemeSkinning 这个框架,
换肤实现的原理,可稍微参考下这篇 (Android一键换肤功能实现)[https://www.jianshu.com/p/29ae23b13808]
一键换肤过程中遇到的问题
- 之前项目中有用到过
ImmersionBar
这个控件,但是在项目换肤过程中换肤过后,ImmersionBar
还是生效了,故把这个控件去掉,然后根据ThemeSkinning
中的状态栏进行调试,结果还是好的。 - 在一些三方控件,例如
SmartRefresh
,MagicIndicator
等类似今日头条顶部的资讯、推荐、关注、汽车、社会
等栏目,也会出现一些变色不过来的麻烦。这时候我们需要在其底部在套一个背景色即可 - 在首页底部5个按钮中,一开始是使用
RadioGroup
加drawableTop
图片来实现的,后面发现图片并不能切换掉,故又使用LinearLayout+Fragment
来实现首页的功能, - 在切换皮肤成功后,发现首页中
Glide
加载的图片都是默认的图片,但是文字什么的都没有变,以为是要换肤成功后重新请求下数据,结果莫名其妙的一个测试中,知道了,动态的xml
中图片加载的需要将xml
中使用的默认图都给去掉,例如ImageView
中的src
,TextView
中的background
都去掉,这样,Glide图片显示的问题就去掉了
话到最后
虽然是使用三方框架集成,但就具体情况来说,还是有一定麻烦的。
还没有评论,来说两句吧...