Android 切换主题换肤实现


思路以及实现
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、 皮肤的切换
如果到了换肤的阶段 就不适合用上面的方法啦!!因为你不可能在 APK 中放入很多套皮肤!这个会让 APK 变的很大很大!得不偿失呀!目前,我公司项目的做法是:从网络端获取皮肤压缩包!!在本地 APK 中异步下载下来之后,解压缩!得到一个文件包!里面的所有文件的名字和本地 APK 是一样的!这时候很简单啦!我们先保存个标志位--表示引用的是哪套皮肤就行啦!此时,我还用到了EventBus这个通信框架!在每个需要改变的皮肤的 Activity 中注册EventBus! 当在设置发出通知后,每个页面能做出更新!!这个思路!!还有一个比较就是有些控件的背景是是selector或者其他的!!这个就需要解析xml文件了!分别读到与之对应的drawable文件之后在组合用的是这个类:StateListDrawable !注意到这点就行啦 !!其他的都很简单了!!这块我就不提供代码啦!!!!
转自:https://www.cnblogs.com/likeandroid/p/4501758.html
Android 切换主题换肤实现的更多相关文章
- Android主题换肤 无缝切换
2016年7月6日 更新:主题换肤库子项目地址:ThemeSkinning,让app集成换肤更加容易.欢迎star以及使用,提供改进意见. 更新日志: v1.3.0:增加一键切换切换字体(初版)v1. ...
- Android 切换主题以及换肤的实现
Android 切换主题以及换肤的实现 一.介绍 现在市面上有很多 APP 有切换主题和皮肤的功能!特别是阅读类的 APP! 上面两张图分别是 知乎 APP 和Fuubo APP的两张截图!都带有切换 ...
- Android主题换肤实现
本系列文章主要是对一个Material Design的APP的深度解析,主要包括以下内容 基于Material Design Support Library作为项目整体框架.对应博文:Android ...
- Android 切换主题 (二)
Android 切换主题 (二) 背景 我原来写过一篇文章关于 android 切换主题的文章 -- Android 切换主题以及换肤的实现 , 里面介绍了如何使用 setTheme() 来切换主题, ...
- Android APK方式换肤实现原理
现在很多APP都有换肤的功能,例如微博,QQ等应用.这些应用的换肤原理是什么? 在用微博的时候,不难发现,当你要换肤时,先下载并安装一个皮肤apk,然后选择这个皮肤,就可以了. 这种方式就是把皮肤打包 ...
- 基于webpack4+vue-cli3项目的换肤功能
起因 最近因公司需求,需要实现主题换肤功能,不仅仅是颜色的更改,还需要包括图片,字体等文件等更换,因此在百度里各种实现方案后,决定根据scss+style-loader/useable做换肤. 项目开 ...
- vue 中使用sass实现主体换肤
有如下代码要实现换肤功能 <template> <div class="app-root" :class="themeClass"> & ...
- vue+less换肤,主题切换方案
新的项目对于客户自定义要求很高,然后换肤是其中一个很小的模块,经过了一段时间的摸索,看了许多文章,找到了几种方案. https://www.cnblogs.com/leiting/p/11203383 ...
- vue 切换主题(换肤)功能
一:先写好两个css样式放在static文件夹中 二:在index.html中添加css link链接 <link rel="stylesheet" id="sty ...
随机推荐
- luogu3312 [SDOI2014]数表 (莫比乌斯反演+树状数组)
link \(\sum_{i=1}^n\sum_{j=1}^m[s(\gcd(i,j))\le a]s(\gcd(i,j))\) \(=\sum_{p=1}^ns(p)[s(p)\le a]\sum_ ...
- 为asp.net core 自定义路由动态修改
根据IApplicationModelConvention 接口 实现相应的方法 /// <summary> /// 定义个类RouteConvention,private 来实现 IAp ...
- PHP中SESSION无法获取问题
近期在看公司老项目,前台可以正常访问,但是后台却无法登录,一直报请求超时,请重新登录!进入服务后发现是有一处SESSION的值无法获取,这就让人很郁闷了,通常SESSION无法使用都是因为没有使用se ...
- Maven入门(二)pom.xml和核心概念
一.pom.xml文件说明 1.pom意思就是project object model. 2.pom.xml包含了项目构建的信息,包括项目的信息.项目的依赖等. 3.pom.xml文件是可以继承的,大 ...
- zookeeper分布式锁简单实现(JavaApi)
1.创建会话连接 package com.karat.cn.zookeeperAchieveLock.javaapilock; import org.apache.zookeeper.WatchedE ...
- Django2.0以上版本的URL的正则匹配问题
正则表达式形式的URL匹配问题: 1.导入re_path from django.urls import path,re_path 2.进行正则匹配 re_path('detail-(\d+).htm ...
- 关于string 的简单应用
声明||作用 string类本不是STL的容器,但是它与STL容器有着很多相似的操作,因此,把string放在这里一起进行介绍. 之所以抛弃char*的字符串而选用C++标准程序库中的string类, ...
- Transition FrameWork
Android Transition Framework可以实现三种效果: 不同Activity之间切换时,Activityc的内容(contentView)转场动画 不同Activity之间切换时, ...
- mysql 死锁解决办法
查询表的时候,发现一圈圈转啊转,就是不出来数据,猜测表被锁住 解决办法 : mysql> show processlist ; mysql> kill 4; 说明 : 4为 i ...
- python 编程,应该养成哪些好的习惯
python 编程,应该养成哪些好的习惯? https://www.zhihu.com/question/28966220 无缓冲输出 python -u sys.stdout.flush() 性能 ...