目的:为了加强用户体验,增强品牌效应,使我们的产品有自己独特的风格,主题的定制将会是必然趋势……然而Android原生系统是不支持主题定制的,所以如何来定制主题,如何做得更好,需要大家集思广益……策略:将介绍两种定制主题的机制:1.根据Android Configuration Qualifier机制,加入我们自己的JRDTheme定制。2.用主题包的形式,根据用户选择不同的主题,而加载不同主题包中的资源。基本原理:首先介绍方式一:Android Configuration QualifierAndroid 系统为一个项目提供了多套可供选择的资源,通过命名特殊的资源文件夹来区别它们。系统在运行的时候,根据设备的当前配置为每个应用加载合适的资源。这些不同的资源都是放在每个应用的res/目录下面的,特殊的命名方式是<resources_name>-<config_qualifier>:<resources_name>: 资源文件夹的名字,与默认资源文件夹保持一致<config_qualifier>: 根据设备不同配置,需要使用的资源文件夹名字Android系统根据优先级的先后顺序已经支持多种Configuration Qualifier,如图1:

安卓主题开发(Android如何定制主题)(1)

安卓主题开发(Android如何定制主题)(2)

如何添加 Jrd Theme ResourcesJrdTheme 的核心策略是当我们设定了不同的主题后,会自动的替换我们想要替换的资源(Framework&App)。具体步骤如下:1. 工程师从UE哪里获得我们想要改变的主题资源,2.把这些资源放到对应模块的res/目录下,以Contacts模块为例,假如我们想要定制drawable、color、layout。原来在Contacts模块中默认的资源目录如下:res/layout/main.xmlinfo.xmldrawable/icon.pngvalues/colors.xml定制后的资源目录如下:res/layout/main.xmlinfo.xmllayout-jrdthemexxx/main.xmlinfo.xmldrawable/icon.pngdrawable-jrdthemexxx/icon.pngvalues/colors.xmlvalues-jrdthemexxx/colors.xmlNotes: jrdthemexxx 是其中一个 主题的 Qualifier,如果有多个主题,那么将会有多个jrdthemexxx存在。3.与原来一样编译这些模块,push到手机中即可。这只是一个guide ,具体实现还要细化…… 目前在diablo、beetle上面已经用这种方式实现了……我在smartiii上尝试过,机制没问题,但是改动的范围太大了,比较麻烦。

方式二:

核心思想:系统中有多套主题资源包,并且应用可以用相同的资源ID来访问不同资源包中对应的资源。 Android原生系统的资源访问流程 对应用来说,资源访问主要有下面三种方式:第一、比较普遍的方式是使用xml定义,并且通过AAPT工具生成一个R文件,列出资源的索引来让Android系统自己去遍历整个资源树的方式来访问。第二、通过Resources接口来访问,使用Resources类的getDrawable、getString等接口来获取资源。第三、通过AssetManager类的接口去访问,使用这个类的open方法来返回一个InputStream对象得到资源。其实这三个访问方式只是Android资源访问中整个流程中在不同层次对外提供的三个接口,到底层的实现都是殊途同归的。因此我们实际上需要修改的部分主干是在访问资源具体路径前,按照当前系统主题设置访问不同资源APK下的文件即是把原生Android中资源ID和资源文件路径之间一对一的关系改为一对多的关系。例子如下:如果原有资源ID和资源文件路径关系为:R.drawable.image01 = 0x7F020001通过系统的资源查找之后找到文件路径为 /system/app/frameworks-res.apk下的res/drawable_hdpi/icon.png在AssetManager native中去读取资源并上传。那么我们需要做的是在传入路径去读取资源时把文件路径替换为/data/app/SystemTheme01.apk下的res/drawable_hdpi/icon.png

​​

安卓主题开发(Android如何定制主题)(3)

安卓主题开发(Android如何定制主题)(4)

,