- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
android应用程序换肤方案
首先android平台api没有特意为换肤提供一套简便的机制,这可能是外国的软件更注重功能和易用,不流行换肤。系统不提供直接支持,我们只能自己捣腾了。
换肤,可以认为是动态替换资源(文字、颜色、字体大小、图片、布局文件……)。这个使用编程语言来动态设置是可以做到的,例如使用View的setBackgroundResource、setTextSize、setTextColor等函数。但我们不可能在每个activity里对页面里的所有控件都通过调用这些函数来换肤,这样的程序代码难以维护、扩展,也违背了UI和代码分离的原则(android开发中UI以xml文件的方式布局)。
通常,皮肤资源会在主程序apk之外提供,以减少主程序的大小,以及方便随时提供新的皮肤扩展。如果你的程序和资源都很小,可以在主程序apk中放入足够的皮肤资源,那你无需往下阅读了,建议你直接采用setTheme的方式实现换肤,很简单,上网搜下。
背景介绍完了,进入正题,本文研究如何搭建一个通用的换肤框架,以实现:
1、皮肤资源和主程序分离;
2、支持原生xml布局文件开发模式;
第1点比较容易实现,目前无非两种方式:(1)皮肤资源放在外部文件夹中,通过一定的规则访问。例如color、dimension等值写在(xml)文件中,图片资源通过一定的命名规则来定位,程序读取外部资源后设置给UI显示。皮肤资源可以压缩为zip,通过网络下载后再解压使用。(2)皮肤资源放在独立的apk中,通过共享android:sharedUserId提供给主程序访问。每个皮肤包都是独立的apk程序,可以下载安装升级。
其实上述两种方式最后都殊途同归,都是通过一定的规则获取外部资源。本文的研究采用了第(2)种方式,在此基础上,用同样的思路可以很容易地实现第(1)种方式。
下面,重点研究第2点:如何支持原生xml布局文件的换肤。本文研究的方案都在实际代码中测试通过。
方案一、使用皮肤apk的context来inflate主程序的layout
流程如下:
1、获取目标皮肤apk的context,例如skinContext;
2、拷贝LayoutInflater对象,并赋予皮肤apk的context,例如skinInflater;
3、解析主程序Layout文件为XmlResourceParser对象,例如layoutParser;
4、用皮肤apk的资源来inflate主程序的layout。 这种方式还可以用来inflate皮肤apk中的layout文件,实现换肤更换布局。
优点:非常简单,几乎不需要更改代码或布局文件。
缺点:1、需要满足皮肤apk的resources结构、命名和主程序apk的一模一样,以保证同名的资源id一样。
2、不需要换肤的资源在皮肤apk中也需要提供一份和主apk一样的拷贝,这对于color、dimension等值资源关系不大,但图片资源则会浪费较大存储空间。
方案二、深入每个控件的构造和换肤
上一个方案存在的缺点,是由于替换了LayoutInflater对象的context导致的(所有资源都替换了,粒度太大)。所以需要有更细粒度的控制。方案二将把资源替换的层级下放到每一个view控件,这样就可以根据需要来决定部分使用主apk的资源,部分使用皮肤apk的资源。
查看源码可以知道,从xml布局文件到生成内存里的view树过程是:
解析xml布局文件 - XmlResourceParser对象 - 对每个节点view - 调用构造函数生成view对象(传入Context 和 AttributeSet)- addView形成一棵view树。
Xml布局文件换肤就是要动态替换(或者动态更改指向)不同的view属性值,这些值是通过AttributeSet传入要构造的view的。查看了许多相关api,没有找到这过程中的合适的入口来改变控件属性(换肤)。只能重载系统控件,在构造函数中获得相关属性,进行重定位。这里会浪费一点开销,因为是先按系统默认的方式构造出view,再改变view的换肤属性值。否则就得完全自己写xml-view的构造过程。
流程如下:
1、从AttributeSet中获得需要换肤的属性名-值对,可换肤的属性值必须是对资源的引用。
2、取出属性值attrValue,获得属性值名称attrValueName,在skinContext中根据attrValueName查找对应的属性值attrValueInSkin。(实现主apk和皮肤apk资源通过名称关联,无需id相等。)
3、取出属性名attrName,通过xml属性-方法映射关系(例如view的/reference/android/view/View.html),调用相关方法设置控件在新皮肤包中的属性值attrVa
您可能关注的文档
最近下载
- 数学中考总复习.doc VIP
- 限制型心肌病超声诊断与评估.pptx
- _【课件】第四章 三角形 +问题解决策略:特殊化课件北师大版七年级数学下册.pptx VIP
- 中考数学总复习第一轮考点复习(重庆专版).pptx VIP
- 2025在线网课《信息检索与科技写作( 理大)》单元测试考核答案.pdf VIP
- 高频精选:京东快递员ai面试题及答案.doc VIP
- 新北师大版初中七年级数学下册《第四章三角形问题解决策略:特殊化(1)》教学课件.pptx VIP
- 河北 2023年农信社储蓄知识考试真题模拟汇编(共213题).doc VIP
- 河北 2023年农信社基础知识考试真题模拟汇编(共672题).doc VIP
- 四川省宜宾市2023-2024学年高一下学期期末学业质量监测语文试卷(原卷版+解析版).docx VIP
文档评论(0)