Android 切换主题以及换肤的实现
一.介绍
现在市面上有很多 APP 有切换主题和皮肤的功能!特别是阅读类的 APP!
上面两张图分别是 知乎 APP 和Fuubo APP的两张截图!都带有切换主题的功能!!无疑,增加了这个功能可以是我们的 APP 有更好的用户体验!更风骚的展现方式!!好了,下面我就以我现在正在做的开源的 博客园 APP 为例,先为大家讲解一下切换主题的功能!!
下面先来看张效果图:
二.思路以及实现
2.1 主题的切换以及实现
首先我们先来明确个概念,现在我所说的切换主题,就切换整个app的颜色风格,当然也有少部分的图片的切换。注意哦 我这边说的是少部分图片哦!如果是大面积的换图片的吧!那就不是切换主题了而是换肤了!好了,咱们言归正传。既然要切换主题,那首先我们得有多套主题。好了,那我们首先来定义两套主题。直接看代码
好了目前为止,我们已经准备好了主题了!但是,有些读者可以能已经看到这是什么鬼?
<item name="textLight">@android:color/white</item>
<item name="appbg">@color/colorPrimaryDarkNight</item>
<item name="textNight">@color/gray</item>
这三行是什么鬼!!他们并不是android*的属性!他们是我自定义的属性!!要问有什么用?马上告诉你!!
首先先来看下这三个属性的代码:
这就是三个属性的定义啦!!
好啦!定义完之后,我们在xml的布局中就可以!要使用顶属性只要在代码中这么引用就行啦
android:background="?attr/appbg"
这样背景色就自动转换成了你设置的这个属性值啦!现在我们要做的就是把要在更改主题的时候变换颜色的控件的背景色或者
字的颜色亦或其他...引用的属性的值就好了!当让这些值在定义Theme的时候要设置好!这里的自定义属性的可控性比较大!随
用户自己弄!!!
现在还剩最后一个问题就是如何设置Theme啦!!!!那么又如何设置Theme了!!别急!activity 为我们提供了一个方法那就是 setTheme(int id) 方法!那有人就说啦!那好办!只要在要设置的属性的时候调用这个方法就行啦!我很遗憾的告诉你不行哦!这个要在 setContentView(int id) 之前调用!!!!!!!那怎吧呢!很简单啊?就是重启当前Activity就行啦!!现在我们还得处理一个问题:就是处理那些 “过时” 的 activity ! 我这里提供的方法是 清空我们的 back stack。
直接看代码:
好了,现在就可以啦!!当然还是有细节要处理的!比如说在我的这个开源项目中:MainActivity-->SettingActity!也就是说 当我换主题之后 我的 MainActivity 也就 GG 了!!所以当我从这个页面返回的时候 我是直接跳转的这个 MainActivity中的!所以这个就会引发一个问题 就是当我 不设置主题的时候!我返回的时候,就会有两个 MainActivity在栈中,所以现在就用到activity的启动模式啦!我是用的 singleTask!!不了解的这个模式的童鞋!可以自行百度哦!!!
好了 切换Theme的讲解就到此结束!!!
2.2 皮肤的切换
如果到了换肤的阶段 就不适合用上面的方法啦!!因为你不可能在 APK 中放入很多套皮肤!这个会让 APK 变的很大很大!得不偿失呀!目前,我公司项目的做法是:从网络端获取皮肤压缩包!!在本地 APK 中异步下载下来之后,解压缩!得到一个文件包!里面的所有文件的名字和本地 APK 是一样的!这时候很简单啦!我们先保存个标志位--表示引用的是哪套皮肤就行啦!此时,我还用到了EventBus这个通信框架!在每个需要改变的皮肤的 Activity 中注册EventBus! 当在设置发出通知后,每个页面能做出更新!!这个思路!!还有一个比较就是有些控件的背景是是selector或者其他的!!这个就需要解析xml文件了!分别读到与之对应的drawable文件之后在组合用的是这个类:StateListDrawable !注意到这点就行啦 !!其他的都很简单了!!这块我就不提供代码啦!!!!