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. Hadoop生态圈介绍及入门(转)

    本帖最后由 howtodown 于 2015-4-2 23:15 编辑 问题导读 1.Hadoop生态圈介绍了哪些组件,分别都是什么? 2.大数据与Hadoop是什么关系? 本章主要内容: 理解大数据 ...

  2. HTML-HTML5+CSS3权威指南阅读(四、媒体查询)

    1.媒体类型 HTML 4和CSS 2目前支持为不同的媒体类型设定专有的样式表, 比如, 一个页面在屏幕上显示时使用无衬线字体, 而在打印时则使用衬线字体, screen 和 print 是两种已定义 ...

  3. mysql安装在centos7报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

    原文链接:http://blog.csdn.net/kuluzs/article/details/51924086 [问题]:mysql版本:5.7.13 首次在centos下安装MySQL,客户端连 ...

  4. [获取行数]php读取大文件提供性能的方法,PHP的stream_get_line函数读取大文件获取文件的行数的方...

    背景: 下面是获取文件的行数的方法: 一个文件如果知道有几行的话,就可以控制获取一定的行数的数据,然后放入数据库.这样不管的读取大文件的性能,还是写入数据库的性能,都能得到很大的提高了. 下面是获取文 ...

  5. Atitit.h5 web webview性能提升解决方案-----fileStrore缓存离线存储+http方案

    Atitit.h5 web webview性能提升解决方案-----fileStrore缓存离线存储+http方案 1. 业务场景 android+webview h5 css背景图性能提升1 2. ...

  6. HDU 4969 Just a Joke(积分)

    HDU 4969 Just a Joke pid=4969" target="_blank" style="">题目链接 推公式,r′=dr/d ...

  7. JAVA Socket 底层是怎样基于TCP/IP 实现的???

    首先必须明确:TCP/IP模型中有四层结构:       应用层(Application Layer).传输层(Transport  Layer).网络层(Internet Layer  ).链路层( ...

  8. weex-iOS集成

    weex-iOS集成 weex只是刚刚起步,还存在一些bug,有些功能还有待完善和提高.但是其使用起来还是可以节省些时间. 这里我们说说如何把weex集成到我们的iOS项目中 1. 下载weex源代码 ...

  9. DOCTYPE 与浏览器模式分析

    DOCTYPE 的诞生 DOCTYPE,或者称为 Document Type Declaration(文档类型声明,缩写 DTD).通常情况下,DOCTYPE 位于一个 HTML 文档的最前面的位置, ...

  10. CCNA2.0笔记_路由相关

    路由器的工作内容 -路由器知道目标地址 -发现到达目标地址的可能的路由 -选择最佳路径(路由表) -维护路由信息 路由的来源 直连路由:直接连到路由器上的网络 -初始化情况下,路由器所知的网络,只有其 ...