热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android学习之换肤功能模块的实现<三>

前面两篇我们学习到换肤的实现方式一:皮肤资源内置在应用中。那么今天来学习另外一种换肤的实现方式:皮肤资源与应用程序分离。皮肤资源将在应用程序外以一种资源包插件

        前面两篇我们学习到换肤的实现方式一:皮肤资源内置在应用中。那么今天 来学习另外一种换肤的实现方式:皮肤资源 与 应用程序分离。

        皮肤资源将在应用程序外 以一种资源包/插件的格式 通过主应用程序下载、安装的方式实现了主应用程序的换肤功能。皮肤资源包 通常有 Apk格式、zip格式、自定义扩展名(如墨迹天气的皮肤资源扩展名是.mja)。


本篇将主要介绍 获取 Apk格式的皮肤资源 实现换肤

             过主程序和皮肤资源程序共享进程实现主程序对皮肤程序中资源的访问,在程序运行时通过代码显示指定皮肤资源,在android系统中,apk之间可以相互读取数据的条件是:有同样的签名,并且AndroidManifest.xml文件中配置的android:sharedUserId属性值相同,那么两个apk运行在同一个进程中,可以互相访问任意数据。

          具体实现步骤如下:

          1> 在主应用程序 和 皮肤资源程序的AndroidManifest.xml中配置相同sharedUserId

              android:sharedUserId是指共用一个uid,也就是,凡是这个属性相同的工程,都会共用同一个uid

          如:android:sharedUserId="com.ice.skin"

          2> 皮肤资源apk 与 主应用apk中对同一功能的皮肤资源文件名要一致。

          3> 在主程序中 获取到皮肤资源apk对应的Context

Context skinCOntext= createPackageContext("皮肤资源包名",Context.CONTEXT_IGNORE_SECURITY);

通过返回的context对象就可以访问到皮肤资源apk中的任何资源啦。

如 访问方式如下:

Drawable drawable =skinContext.getResources().getDrawable(R.drawable.bg_title)

(皮肤资源Apk 无需包含任何UI Activity,只需要包含需要更换皮肤的res资源文件)


        如demo程序中 主程序 AndroidManifest.xml 内容如下:


android:sharedUserId="com.ice.skin"
package="com.ice.skinexternal" >

android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
android:debuggable="true"
android:label="@string/app_name" >
android:name="com.ice.skinexternal.MainActivity"
android:screenOrientation="portrait"
android:label="@string/app_name" >









        

        皮肤资源APK程序中 AndroidManifest.xml 内容如下:


android:sharedUserId="com.ice.skin"
package="com.ice.skin1" >

android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:debuggable="true"
android:label="@string/app_name" >





      主程序和皮肤资源程序 res/drawable-hdpi 中都具有命名相同的皮肤背景图片  如下图:

      


      主程序Activity 实现换肤的主要代码如下:

    private Context skinContext;

private Button btn_skinChange;

/**
* UI上 "切换皮肤" 按钮 的事件绑定处理
*/
private void bindEvent() {
try {
skinCOntext= createPackageContext("com.ice.skin1", Context.CONTEXT_IGNORE_SECURITY);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}

btn_skinChange.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (skinContext != null) {
Drawable bgCOntent= skinContext.getResources().getDrawable(R.drawable.bg_content);
if (bgContent != null) {
rl_content.setBackground(bgContent);
}

Drawable bgTitle = skinContext.getResources().getDrawable(R.drawable.bg_title);
if (bgTitle != null) {
tv_title.setBackground(bgTitle);
}
} else {
Toast.makeText(MainActivity.this, "没有下载 外置皮肤资源", Toast.LENGTH_SHORT).show();
}
}
});
}

       demo程序换肤效果如下:

 ->点击 切换皮肤 按钮 ->






推荐阅读
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 近来有一个需求,是需要在androidjava基础库中插入一些log信息,完成这个工作需要的前置条件有编译好的android源码具体android源码如何编译,这 ... [详细]
  • 【CTF 攻略】第三届 SSCTF 全国网络安全大赛—线上赛 Writeup
    【CTF 攻略】第三届 SSCTF 全国网络安全大赛—线上赛 Writeup ... [详细]
  • *resraw和assets的相同点:1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。*resraw和assets的不同点:1.resraw中的文件会 ... [详细]
  • 2021年最详细的Android屏幕适配方案汇总
    1Android屏幕适配的度量单位和相关概念建议在阅读本文章之前,可以先阅读快乐李同学写的文章《Android屏幕适配的度量单位和相关概念》,这篇文章 ... [详细]
  • 这两天用到了ListView,写下遇到的一些问题。首先是ListView本身与子控件的焦点问题,比如我这里子控件用到了Button,在需要ListView中的根布局属性上加上下面的这一个属性:and ... [详细]
author-avatar
艾薇卡皮草它_791
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有