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

亦凉 2021-06-24 16:09 417阅读 0赞

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

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”,

    1. new SkinLoaderListener() {
    2. @Override
    3. public void onStart() {
    4. Log.i("SkinLoaderListener", "正在切换中");
    5. //dialog.show();
    6. }
    7. @Override
    8. public void onSuccess() {
    9. Log.i("SkinLoaderListener", "切换成功");
    10. }
    11. @Override
    12. public void onFailed(String errMsg) {
    13. Log.i("SkinLoaderListener", "切换失败:" + errMsg);
    14. }
    15. @Override
    16. public void onProgress(int progress) {
    17. Log.i("SkinLoaderListener", "皮肤文件下载中:" + progress);
    18. }
    19. }
    20. );
  8. 一些重要的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图片显示的问题就去掉了

话到最后

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

发表评论

表情:
评论列表 (有 0 条评论,417人围观)

还没有评论,来说两句吧...

相关阅读