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 切换主题以及换肤的实现的更多相关文章

  1. vue 切换主题(换肤)功能

    一:先写好两个css样式放在static文件夹中 二:在index.html中添加css link链接 <link rel="stylesheet" id="sty ...

  2. Android 切换主题 (二)

    Android 切换主题 (二) 背景 我原来写过一篇文章关于 android 切换主题的文章 -- Android 切换主题以及换肤的实现 , 里面介绍了如何使用 setTheme() 来切换主题, ...

  3. Android项目中的换肤总结

    纵观现在各种Android app,其换肤需求可以归为 白天/黑夜主题切换(或者别的名字,通常2套),如同花顺/自选股/天天动听等,UI表现为一个switcher. 多种主题切换,通常为会员特权,如Q ...

  4. Android 切换主题换肤实现

    思路以及实现 1.主题的切换以及实现 首先我们先来明确个概念,现在我所说的切换主题,就切换整个app的颜色风格,当然也有少部分的图片的切换.注意哦 我这边说的是少部分图片哦!如果是大面积的换图片的吧! ...

  5. Android App插件式换肤实现方案

    背景 目前很多app都具有换肤功能,用户可以根据需要切换不同的皮肤,为使我们的App支持换肤功能,给用户提供更好的体验,在这里对换肤原理进行研究总结,并选择一个合适的换肤解决方案. 换肤介绍 App换 ...

  6. 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 ...

  7. Android插件化的思考——仿QQ一键换肤,思考比实现更重要!

    Android插件化的思考--仿QQ一键换肤,思考比实现更重要! 今天群友希望写一个关于插件的Blog,思来想去,插件也不是很懂,只是用大致的思路看看能不能模拟一个,思路还是比较重要的,如果你有兴趣的 ...

  8. Android 打造自己的个性化应用(一):应用程序换肤主流方式的分析与概述

    Android平台api没有特意为换肤提供一套简便的机制,这可能是外国的软件更注重功能和易用,不流行换肤.系统不提供直接支持,只能自行研究. 换肤,可以认为是动态替换资源(文字.颜色.字体大小.图片. ...

  9. 使用 css/less 动态更换主题色(换肤功能)

    前言 说起换肤功能,前端肯定不陌生,其实就是颜色值的更换,实现方式有很多,也各有优缺点 一.看需求是什么 一般来说换肤的需求分为两种: 1. 一种是几种可供选择的颜色/主题样式,进行选择切换,这种可供 ...

随机推荐

  1. oracle将一个表中字段的值赋值到另一个表中字段(批量)

    面积表中数据错误,现将面积表中的sfmj字段的值改为居民信息表中匹配字段的值 update (select s.name name1,s2.name name2 from simple s,simpl ...

  2. jQuery基本选择 元素

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  3. jetty maven插件端口设置

    在jetty的maven插件中有两种方式设置jetty的端口(默认为:8080). 第一种,通过命令行,在启动jetty的时候设置:mvn -Djetty.port=8081 jetty:run 第二 ...

  4. tar排除指定目录打包

    转载自:http://hxl2009.blog.51cto.com/779549/476513 假设 test目录下有 1 2 3 4 5 这5个目录现在要将 3 4 5目录tar打包,1和2目录不要 ...

  5. .Net 程序员面试 C# 语言篇 (回答Scott Hanselman的问题)

    过去几年都在忙着找项目,赶项目,没有时间好好整理深究自己在工作中学到的东西.现在好了,趁着找工作的这段空余时间,正好可以总结和再继续夯实自己的.Net, C#基本功.在05年的时候,Scott Han ...

  6. Springboot读取配置文件的两种方法

    第一种: application.yml配置中的参数: zip: Hello Springboot 方法读取: @RestController public class ControllerTest ...

  7. unity, TRANSFORM_TEX

    TRANSFORM_TEX在UnityCG.cginc中定义. ----补充: 为啥buildin shader  Unlit-Normal.shader中有一个float4 _MainTex_ST变 ...

  8. 可能是最通俗易懂的 Java 位操作运算讲解

    https://blog.csdn.net/briblue/article/details/70296326

  9. 点滴积累【other】---.net程序员面试题总结

    自己总结的.net的面试题. 说明:以下代码均已经过验证正确无误! C#: 1.c#实现N的阶乘: class Program { static void Main(string[] args) { ...

  10. NEFU 117-素数个数的位数(素数定理)

    题目地址:NEFU 117 题意:给你一个整数N(N<1e9).假设小于10^N的整数中素数的个数为π(N).求π(N)的位数是多少. 思路:题目的数据量非常大,直接求肯定TLE,所以考虑素数定 ...