`
jcccn
  • 浏览: 2740 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

Android程序如何实现换肤?

阅读更多

 

原文链接:http://jcccn.me/post/50909144862/skins-on-android

 

安卓上换肤可以通过那些方式来实现呢?

 

源码下载地址:https://github.com/jcccn/Shared-Code/tree/master/Android/SkinTest

 

方式一:切换程序的语言版本。

     原理:系统根据一定的规则去资源文件夹res下寻找资源。通过改变程序的配置(比如语言或者地区),就能加载不同资源文件夹下面的资源,从而实现简单的换肤。

     实践:举例说明,我要通过中文(系统默认)和英文两个语言版本来实现换肤。首先增加两个资源文件夹drawable-en-mdpi和layout-en,如下图。当在默认的中文环境下,使用的是drawable-mdpi和layout下面的资源。切换至英文环境之后,程序则会使用drawable-en-mdpi和layout-en下面的资源,在这两个文件夹下找不到的时候才去使用默认的drawable-mdpi和layout下面的资源。

 

            截图

 

     要实现语言环境的切换,同时不改变系统的语言环境,我们就要改变当前应用的语言,使用Resources实例的updateConfiguration方法即可。示例代码如下:

 

     changeLanguage(Locale.ENGLISH);
     private void changeLanguage(Locale newLocale) {
          Resources resources = getResources();
          Configuration config = resources.getConfiguration();
          DisplayMetrics dm = resources.getDisplayMetrics();
          config.locale = newLocale;
          resources.updateConfiguration(config, dm);

          this.onCreate(null); // 用于立即刷新界面
     }

 

     但是这种方式有一些局限性:只能更换本apk内置的资源且受限于语言种数;需要重新create activity等方式才能刷新界面;可能影响程序其他依赖于语言的元素。这种方式属于一种投机取巧的方法,不建议使用。

     总结:两步实现,第一步,增加不同语言版本的资源文件夹;第二步,程序内部切换语言。

 

方式二:安装主题apk。

     原理:通过获取其他程序的context来获取皮肤资源。我们知道android程序中要获取drawable、layout等资源,都要通过context.getResources().getXXX的方式。关键就在这儿了,如果我们可以拿到其他程序的context,那么那个程序就可以作为皮肤程序来提供资源给主程序使用了。android中两个程序相互读取数据的条件是:两个程序的共享用户id相同,通过AndroidManifest.xml中的android:sharedUserId属性配置;两个程序签名相同。想要改变皮肤时,改变提供资源的context为皮肤程序的context,然后刷新即可。

     实践:有一点要注意,要保证能正确获取到皮肤包中的资源,需要编译出来的皮肤包与主程序中的R.java文件一致,即资源对应要一致(主程序中有layout、color、drawable、value等多少类资源,皮肤包中也需要有相同数量的资源)。

 

Context skinContext = createPackageContext(skinPackageName, Context.CONTEXT_IGNORE_SECURITY);
contentView.setBackgroundDrawable(skinContext.getResources().getDrawable(R.drawable.gloal_background));

 

 

方式三:使用皮肤资源zip包。

     原理:直接从文件(SD卡或者data目录)中读取资源文件并解码,然后设置给相关的控件。

     实践:实现方式可以是直接一个包含皮肤资源(图片、控制布局的一些数值文本文件等)的压缩包,通常后缀名被命名为自己独有的名字,比如搜狗的sga,百度的bds等,使用时被解压拷贝到手机存储上的皮肤文件夹里面;也可以是包含在一个单独的apk安装包里面,安装应用皮肤后皮肤压缩包(一般放在皮肤apk的asset目录下)被解压拷贝到data目录下以供使用。

     这种方式需要注意的一个地方就是内存管理的问题。一般是new一些bitmap或者BitmapDrawable之类的对象出来,在不再使用的时候要注意释放。一个思路是参照系统Resources类的管理方式,详细实现方式后面再研究研究。

 

2
0
分享到:
评论

相关推荐

    Android皮肤资源内置实现换肤功能Demo

    该资源是 Android 应用实现换肤功能的demo程序,同时也是博客文章:http://blog.csdn.net/janice0529/article/details/39999727 中demo程序, 博客中有详细的demo程序设计介绍。

    apk方式实现android应用程序换肤

    文章:http://blog.csdn.net/hailushijie/article/details/9454679

    apk方式实现android应用换肤

    apk方式实现android应用程序换肤。 文章:http://blog.csdn.net/hailushijie/article/details/9454679

    Android编程实现换肤功能实例

    本文实例讲述了Android编程实现换肤功能的方法。分享给大家供大家参考,具体如下: 本系列专题培训适用范围:初级Android程序员,即有J2SE基础和Android初级水平。J2SE基础是指掌握JAVA语法,1.5、1.6新增的语法不...

    安卓换肤主题更换夜间模式相关-Android夜间模式实现通过在window上加一层半透明的View.rar

    Android夜间模式实现,通过在window上加一层半透明的View.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

    android使用SkinManager实现换肤功能的示例

    试着用鸿洋大神写的SkinManager实现了换肤功能。 一、配置 在app下build.gradle中添加依赖: //换肤功能 compile 'com.zhy:changeskin:4.0.2' 这样就配置好了,然后在程序入口进行初始化。 二、全局初始化 在自己...

    分析Android App中内置换肤功能的实现方式

    但我们不可能在每个activity里对页面里的所有控件都通过调用这些函数来换肤,这样的程序代码难以维护、扩展,也违背了UI和代码分离的原则(android开发中UI以xml文件的方式布局)。 通常,皮肤资源会在主程序apk之

    Android应用开发中实现apk皮肤文件换肤的思路分析

    在android的项目开发中,都会遇到后期功能拓展增强与主程序代码变更的现实矛盾,也就是程序的灵活度。 由于linux平台的安全机制,再...而在Android中的实现思路,即为将一个较大的APK,分离为一个主程序的APK,和其他各

    2010年谢彦的android笔记

    原创2010年android文档的整理打包的pdf档(含目录) 文档内容不能复制, 介意者请慎下. 大部分内容可在http://blog.csdn.net/xieyan0811上看到 文档目录如下 1 系统配置 1 1.1 建立SDK开发环境 2 1.2 Android源码的...

    安卓天气预报源码(带换肤功能)weatherApp.7z

    4、应用场景:安卓编程,项目产品化、资源处理等内容实现 5、特点:简化安卓移动开发代码实现过程 6、适用人群:想阅读安卓app源码的初学者 7、使用/学习说明:在学习的过程要结合安卓开发的核心原理与内容需求分析和...

    android源码包集合4

    获取Android系统程序信息.rar 获取Gps信息的程序源码.rar 获取网络数据到本地并查看.rar 调用Android中的软键盘.rar 超爽的android抽屉效果.rar 防止内存溢出浅析.rar 飞行历 飞行模式 AirPlus.rar 飞行射击类游戏...

    android笔记.rar

    android笔记.doc android笔记.pdf 1 系统配置... ..1 1.1 建立SDK开发环境... ...2 1.2 Android源码的编译 ... .6 1.3 编译在G1 上运行的android 2.1(eclair)代码 ... ..9 1.4 编译在G1 上运行的android 2.2(froyo)...

    skinfram:网易云海量一键换肤框架

    skinfram ###网易云海量一键换肤框架 ###要实现的功能就是当我下载下来皮肤包进行更换的时候, 程序中所有页面的皮肤都要同步切换,并且当进程杀死后,重启程序,更换过的皮肤不能够消失,要可以正常显示,效果图:

    仿墨迹天气在Android App中实现自定义zip皮肤更换

    在这里谈一下墨迹天气的换肤实现方式,不过首先声明我只是通过反编译以及参考了一些网上其他资料的方式推测出的换肤原理, 在这里只供参考. 若大家有更好的方式, 欢迎交流. 墨迹天气下载的皮肤就是一个zip格式的压缩包...

    麦库记事Windows客户端 v6.8.5.27.zip

    继不久前推出 Android平台上的应用产品以后,该团队在今天又带来了一款尚在封测过程中的PC客户端应用程序。相比于老牌的 Evernote,麦库更为轻量级,整个安装程序不足3MB,同时,面对海量的个人知识库文档,麦库还...

Global site tag (gtag.js) - Google Analytics