Android 切换主题以及换肤的实现
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 !注意到这点就行啦 !!其他的都很简单了!!这块我就不提供代码啦!!!!
结束
最后还是希望大家 关注 / start 一下我博客园客户端的开源项目 :
github地址
Android 切换主题以及换肤的实现的更多相关文章
- vue 切换主题(换肤)功能
一:先写好两个css样式放在static文件夹中 二:在index.html中添加css link链接 <link rel="stylesheet" id="sty ...
- Android 切换主题 (二)
Android 切换主题 (二) 背景 我原来写过一篇文章关于 android 切换主题的文章 -- Android 切换主题以及换肤的实现 , 里面介绍了如何使用 setTheme() 来切换主题, ...
- Android项目中的换肤总结
纵观现在各种Android app,其换肤需求可以归为 白天/黑夜主题切换(或者别的名字,通常2套),如同花顺/自选股/天天动听等,UI表现为一个switcher. 多种主题切换,通常为会员特权,如Q ...
- Android 切换主题换肤实现
思路以及实现 1.主题的切换以及实现 首先我们先来明确个概念,现在我所说的切换主题,就切换整个app的颜色风格,当然也有少部分的图片的切换.注意哦 我这边说的是少部分图片哦!如果是大面积的换图片的吧! ...
- Android App插件式换肤实现方案
背景 目前很多app都具有换肤功能,用户可以根据需要切换不同的皮肤,为使我们的App支持换肤功能,给用户提供更好的体验,在这里对换肤原理进行研究总结,并选择一个合适的换肤解决方案. 换肤介绍 App换 ...
- Android换肤技术总结
原文出处: http://blog.zhaiyifan.cn/2015/09/10/Android%E6%8D%A2%E8%82%A4%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB ...
- Android插件化的思考——仿QQ一键换肤,思考比实现更重要!
Android插件化的思考--仿QQ一键换肤,思考比实现更重要! 今天群友希望写一个关于插件的Blog,思来想去,插件也不是很懂,只是用大致的思路看看能不能模拟一个,思路还是比较重要的,如果你有兴趣的 ...
- Android 打造自己的个性化应用(一):应用程序换肤主流方式的分析与概述
Android平台api没有特意为换肤提供一套简便的机制,这可能是外国的软件更注重功能和易用,不流行换肤.系统不提供直接支持,只能自行研究. 换肤,可以认为是动态替换资源(文字.颜色.字体大小.图片. ...
- 使用 css/less 动态更换主题色(换肤功能)
前言 说起换肤功能,前端肯定不陌生,其实就是颜色值的更换,实现方式有很多,也各有优缺点 一.看需求是什么 一般来说换肤的需求分为两种: 1. 一种是几种可供选择的颜色/主题样式,进行选择切换,这种可供 ...
随机推荐
- 01-spring-专题IOC
接口: 1,用于沟通的中介物的抽象化 2,实体把自己提供给外界的一种抽象化说明,用以内部操作分离出外部沟通方法,使其能被修改内部而不影响外界其他实体与其交互的方式(内部可能修改了,但是接口不变). 简 ...
- JConsole的使用手册 JDK1.5(转)
一篇Sun项目主页上介绍JConsole使用的文章,前段时间性能测试的时候大概翻译了一下以便学习,今天整理一下发上来,有些地方也不知道怎么翻,就保留了原文,可能还好理解点,呵呵,水平有限,翻的不好,大 ...
- Codeigniter 使用 Mysql 存储过程
本篇文章由:http://xinpure.com/codeigniter-using-mysql-stored-procedures/ 执行存储过程 $query = $this -> db - ...
- Latex中设置字体颜色
在用Latex时,想要使用不同颜色来突出某些关键点,有以下三种方案: 1.组合red.green和blue的值合成我们想要的颜色 \usepackage{color} \textcolor[rgb]{ ...
- 弹出键盘windowsoftinputmode属性设置值
windowSoftInputMode属性设置值 2012-08-30 16:49 1592人阅读 评论(0) 收藏 举报 androidattributes活动 (1).AndroidManifes ...
- TypesMethodsAndFields
https://github.com/JesusFreke/smali/wiki/TypesMethodsAndFields Types dalvik's bytecode has two major ...
- 终端I/O termios属性设置 tcsetattr设置(转)
终端I/O有两种不同的工作方式: 规范方式输入处理.在这种方式中,终端输入以行为单位进行处理.对于每个读要求,终端驱动程序最多返回一行. 非规范方式输入处理.输入字符不以行为单位进行装配. 如果不作特 ...
- h5-文本框
h5-文本框 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- apue.h文件找不到的解决办法
参考:http://blog.csdn.net/nihaotoyou/article/details/16827675 1.首先到该书的官网下载源代码:http://www.apuebook.com/ ...
- c++的.o文件的链接顺序
linker对链接顺序要求很严格,如果顺序有误,多半就会报undefined reference to xxxxxx的错误 文件目录: 代码: main.cpp #include "Test ...