Android一键换肤功能实现及实现过程中Glide图片显示问题

版权声明:本文为徐代龙原创文章,未经徐代龙允许不得转载。网络资源网站:xudailong.cc 福利网站:www.00reso.com 公众号:蛇崽网盘教程资源 https://blog.csdn.net/xudailong_blog/article/details/87782229

因为时间紧,任务急,工程量可能会大,使用的换肤框架是

https://github.com/burgessjp/ThemeSkinning 这个,代码嵌入量少,集成进去也简单,作为新手,可以把demo运行起来,多点几下,就差不多了。

场景

因为在我的项目中是需要把状态栏,主页底部Tab页的资源文件,还有其他页面的资源文件都需要替换掉,所以,相对于白天黑夜模式的换肤,工程量可能会多一些。

集成步骤

  1. 添加依赖 compile ‘com.solid.skin:skinlibrary:latestVersion’

  2. 让你的 Application 继承于 SkinBaseApplication

  3. 让你的 Activity 继承于 SkinBaseActivity,如果使用了 Fragment 则继承于 SkinBaseFragment

  4. 在需要换肤的根布局上添加 xmlns:skin=“http://schemas.android.com/android/skin” ,然后在需要换肤的View上加上 skin:enable=“true”

  5. 新建一个项目模块(只包含有资源文件,例如本项目的 skinpackage 模块),其中包含的资源文件的 name 一定要和原项目中有换肤需求的 View 所使用的资源name一致。

  6. 拿到上一步生成的文件( ×××.apk ),改名为 ×××.skin,放入 assets 中的 skin 目录下( skin 目录是自己新建的)

  7. 在合适的地方调用换肤

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

                 }
             }

     );
  1. 一些重要的API
SkinConfig.isDefaultSkin(context):判断当前皮肤是否是默认皮肤

SkinManager.getInstance().restoreDefaultTheme(): 重置默认皮肤

dynamicAddView:当动态创建的View也需要换肤的时候,就可以调用 dynamicAddView

还是建议使用下 https://github.com/burgessjp/ThemeSkinning 这个框架,
换肤实现的原理,可稍微参考下这篇 (Android一键换肤功能实现)[https://www.jianshu.com/p/29ae23b13808]

一键换肤过程中遇到的问题

  1. 之前项目中有用到过ImmersionBar这个控件,但是在项目换肤过程中换肤过后,ImmersionBar还是生效了,故把这个控件去掉,然后根据ThemeSkinning中的状态栏进行调试,结果还是好的。
  2. 在一些三方控件,例如SmartRefresh,MagicIndicator 等类似今日头条顶部的资讯、推荐、关注、汽车、社会等栏目,也会出现一些变色不过来的麻烦。这时候我们需要在其底部在套一个背景色即可
  3. 在首页底部5个按钮中,一开始是使用RadioGroupdrawableTop图片来实现的,后面发现图片并不能切换掉,故又使用LinearLayout+Fragment来实现首页的功能,
  4. 在切换皮肤成功后,发现首页中Glide加载的图片都是默认的图片,但是文字什么的都没有变,以为是要换肤成功后重新请求下数据,结果莫名其妙的一个测试中,知道了,动态的xml中图片加载的需要将xml中使用的默认图都给去掉,例如ImageView中的srcTextView中的background都去掉,这样,Glide图片显示的问题就去掉了

话到最后

虽然是使用三方框架集成,但就具体情况来说,还是有一定麻烦的。

猜你喜欢

转载自blog.csdn.net/xudailong_blog/article/details/87782229