Gloomy's Blog

Gloomy's Blog Website

0%

Android夜间模式(换肤)

<Excerpt in index | 首页摘要>

Android夜间模式(换肤)

<The rest of contents | 余下全文>

本来已经写过这样的一篇博客了,但是因为老的系统崩溃,数据库没有保存,导致数据丢失。

由于自己打算将这个换肤抽取成为一个换肤框架,所以才又重新写一篇。这篇是用于阐述思路,下一篇将会是具体的实现。(希望不是个坑~)

夜间模式实现,总的来说思路还是比较多,包括谷歌在v7包中也推出了一款(有兴趣的去自行百度一下吧)

但是总的来说都是有一个问题,需要重启已经启动当前的界面,方能实现。

因为切换皮肤开关逻辑的设计,我们必须要在不重启的状态下去刷新界面。所以决定自己来设计这个换肤框架。

最开始的设想就是,继承所有我们需要的View,重写他,然后通过自定义属性设置日/夜 模式的响应资源。然后项目界面中使用的布局都通过我们自己写的View来写。

然后在所有自定义控件中通过EventBus来监听事件。

换肤的时候通过EventBus来发送皮肤更换广播,来让界面发生变换。但是出现了一个问题,如下:

AAct -> BAct -> BAct中发出更换皮肤消息 -> BAct成功换肤,但是AAct换肤方法走了。但是没有换肤。~

然后修改思路为如下:

给所有的Activity设置Tag,(Fragment的Tag使用加载的Activity)然后每个View附加上的时候检测当前runtimeTag, 然后给自己打上Tag标记,代表当前是属于哪个界面的,然后发送换肤消息的时候,检查 当前显示界面的Tag,和自身Tag作对比,如果一致就切换皮肤。

但是如果不一致。就略过。

然后在每个Activity的onResume 中去检测当前显示的皮肤和自己现在显示的皮肤,做对比,如果不一致就直接切换皮肤。

大致思路如上,目前这个小的思路架构并不支持插件化的皮肤更换。

目前这个思路已经可以解决我们的项目囧境。(说白了 俺太懒)。先这样,等具体实现后会上传至github。(希望不是个坑~)