android下apkplug通用主题(皮肤)切换解决方案之主应用-01

该文章是基于apkplug V1.6.8 进行说明的

我们提供了一个demo做为参考,项目下载地址为:http://git.oschina.net/plug/IMThemeDemo

该 IMThemeDemo 实现了简单的聊天泡泡切换功能,同时主题包(插件)是托管在apkplug的云服务器上的。所以要阅读项目的完整代码可以先看插件托管服务开发系列文章 <插件托管服务开发指南>

demo运行效果图:

一,apkplug的主题说明

apkplug主题解决方案摒弃了以往以图片替换的形式切换效果的方式,转而使用android原生资源和素材来切换UI样式和效果。所以从体验效果上是一次极大的提升。

二,apkplug主题(皮肤)切换适用范围

apkplug主题解决方案适用安卓界面的整个层次。其包括通用主题样式,和自定义控件样式切换两个层面

1.通用主题样式

与系统主题相似(Activity.setTheme()) 我们在系统与app(插件)之间可新增一层主题,三层主题已叠加的形式形成最终结果

2.自定义控件样式

大部分情况下我们的app都会自己设计主题,或者针对某写控件设计自己的样式,在这种模式下以上的通用主题便缺少

其存在的意义了。因此apkplug也提供一种简单有效的方案,允许开发者根据自己的需求定义自定义UI控件样式的替换规则

在不失通用性兼容性简洁性的情况下达到最好的体验。

三,主题(皮肤)切换流程

1.通用主题样式

通用主题样式有apkplug框架在底层适配,app开发过程中无需过多考虑,只要主题包设置了通用主题样式,app中的Activity 主题将自定替换(最前面的Activity需刷新后才能体现)

2.自定义控件样式

自定义控件样式的替换由于每个app的特殊性的原因,没法做统一的规范。但apkplug经过几个月的努力研发出一套简单有效的实施方案,允许开发者自由定制适合自己app的替换接口。而主题包设计者根据该接口简单配置即可。

四,自定义控件样式替换接口举例

1.定义替换接口

以 IMThemeDemo项目为例,我们需要替换聊天界面的聊天泡泡,所以自定义了以下的这样一个接口

com.apkplug.imthemedemo.themeinterface.chatstyles

01 public interface chatstyles
{
02     //我们协定如果
返回值小于0为未设置状态
03     //主题样式版本,如果主题样式接口有所改变就利用这来判断
04     public int Version();
05     //聊天界面右侧Item
背景样式
06     public int chat_right_msg_background();
07     //聊天界面左侧Item
背景样式
08     public int chat_left_msg_background();
09     //聊天界面背景
10     public int chatbackground();
11 }

以上接口返回值是一个资源ID,它可能是一张图片或者一个xml布局样式。但它将由主题包(插件)提供。

2.主程序监听主题切换事件

以上我们定义了一套UI样式的切换接口,但我们主应用并不知道合适会有主题包来替换我们现有的样式。所以我们需要一个监听器来监听这个接口事件,一下是模板代码 (此处设计一些OSGI服务方面的知识,不明白的同学可看 OSGI服务基本原理),但我们提供模板代码,开发者可以先实现在研究其原理。

定义一个专门监听接口事件变化的单例类

com.apkplug.imthemedemo.ThemeChengFactory

01 mcontext.addServiceListener(
02     new ServiceListener(){
03     @Override
04     public void serviceChanged(ServiceEvent
event) {
05         switch  (event.getType())
{
06             case  ServiceEvent.REGISTERED:
07                 if  (ref 
==   
null )
{
08                     //当有主题包注册了该接口,意味着它为我们提供样式切换的具体资源了
09                     ref 
=  event.getServiceReference();
10                     service 
=  (chatstyles) mcontext.getService(ref);
11                 }
12                 break ;
13             case  ServiceEvent.UNREGISTERING:
14                 if  (ref 
==  event.getServiceReference()) {
15                     //主题包注销了该接口,意味着它不再提供切换的具体资源了
16                     mcontext.ungetService(ref); 
17                     service 
=   
null ;
18                     ref 
=   
null ;
19                 }
20                 break ;
21         }
22                              
23     }
24 },String.format("(objectclass=%s)",chatstyles.class.getCanonicalName())
);

3.界面创建时判断是否切换样式

上一步我们已经实现了监听接口注册与注销事件,但我们还没有将切换的样式绑定到具体的控件上来。这一步我们将完成这一块工作

根据上一段代码我们得知 ThemeChengFactory类中的chatstyles service 成员变量在主题包注册以后不为空,没有注册时为空。这样我们便通过判断 serice是否为空来判断是否有主题样式可切换。同时我们判断返回值是否为-1来判断主题包提供的样式是否完整

注:我们约定主题包可能只提供了接口的部分控件样式,其他样式返回-1 表示没有提供相应资源

4.在创建控件时设置样式

1)聊天泡泡样式

com.apkplug.imthemedemo.adapter.ChatMsgViewAdapter

01 chatstyles
cs=ThemeChengFactory.getInstance(
null).getService();
02 if(cs!=null){
03    //chatstyles
不为空表示有主题包提供替换的资源
04    ViewHolder
v= (ViewHolder)convertView.getTag();
05    if(isComMsg){
06     if(cs.chat_left_msg_background()!=-1){
07     //主题包提供的该控件资源ID
08         v.tvContent.setBackgroundResource(cs.chat_left_msg_background());
09     }
10     }else{
11     if(cs.chat_right_msg_background()!=-1){
12         //主题包提供的该控件资源ID
13         v.tvContent.setBackgroundResource(cs.chat_right_msg_background());
14     }
15     }
16 }

2)聊天界面背景图片样式

com.apkplug.imthemedemo.activity.ChatActivity

1 chatstyles
cs=ThemeChengFactory.getInstance(
null).getService();
2 if(cs!=null){
3     //有主题包提供接口样式
4     if(cs.chatbackground()!=-1){
5        //提供该控件样式资源ID
6        mListView.setBackgroundResource(cs.chatbackground());
7     }
8 }

5.监听主题切换事件,重刷UI

第四步我们完成了在UI创建刷新时判断并替换新的样式,但目前为止我们还不只到什么时候应该刷新UI。以下将解决这个问题

当主题包设置了可替换主题以后,apkplug会给监听器发送主题切换事件,我们可注册这样一个监听器实时监听主题切换事件刷新activity从而实现实时换肤的功能。

com.apkplug.imthemedemo.activity.MainActivity

01 public void ListenerTheme(){
02 BundleContext
context=frame.getSystemBundleContext();
03 ServiceReference
reference=context.getServiceReference(RegThemeChengeListener.
class.getName());
04    if(null!=reference){
05     //查询主题切换事件监听器注册服务
06     final RegThemeChengeListener
service=(RegThemeChengeListener) context.getService(reference);
07     if(service!=null){
08         //找到服务注册一个监听器,实时监听主题切换动态
09         service.registerOnThemeListener(
10             new OnThemeChengeListener(){
11             @SuppressLint("NewApi")
12             @Override
13             public void afterChenged(org.osgi.framework.Bundle
arg0, 
int arg1)
{
14                 //主题切换以后我们重刷Activity
15                 MainActivity.this.recreate();
16                 System.out.println("afterChenged");
17                 //把上一个监听器注销,因为界面被重刷以后我们又注册了一个新的监听器
18                 service.unregisterOnThemeListener(this);
19             }
20             @Override
21             public void beforeChenge(
22                 org.osgi.framework.Bundle
bb, 
int arg1,org.osgi.framework.Bundle
tob, 
int arg2)
{
23                                  
24             }
25         });
26     }
27     context.ungetService(reference);
28    }
29 }    

我们没有在ChatActivity界面设置监听器重刷的原因是,每次设置主题我们都会到主题包的Activity中,并且返回以后每次都重新进入ChatActivity界面,所以ChatActivity不需要重刷(因为它每次都是新的)

完成以上步骤以后主应用完成了,但这还不够因为我们还没有开发主题包(插件)呢。下一节将讲解怎么开发主题包,它同样简单快捷

android下apkplug通用主题(皮肤)切换解决方案之主应用-01

时间: 2024-10-07 04:02:27

android下apkplug通用主题(皮肤)切换解决方案之主应用-01的相关文章

android下apkplug通用主题(皮肤)切换解决方案之主题包开发-02

该文章是基于apkplug V1.6.8 进行说明的 我们提供了一个demo做为参考,项目下载地址为:http://git.oschina.net/plug/IMThemeDemo 该 IMThemeDemo 实现了简单的聊天泡泡切换功能,同时主题包(插件)是托管在apkplug的云服务器上的.所以要阅读项目的完整代码可以先看插件托管服务开发系列文章 <插件托管服务开发指南> demo运行效果图: 上一篇文章我们实现了主应用的开发,本篇应用我们开发主题包(插件). 一,主题包说明 apkplu

apkplug主题皮肤切换之自定义样式-05

本文基于apkplug V1.6.9讲解 一 何为apkplug自定义样式切换 apkplug主题切换包含两个层次 1.通用主题,与系统主题相似 2.自定义控件样式切换 根据上一篇文章讲解我们可以判定通用主题有其局限性,在很多情况下我们需要替换的是与我们应用本事相结合的自定义控件样式.如QQ聊天挂件 QQ皮肤,QQ聊天泡泡等.针对这种情况我们为apkplug新设计了一套接口,以满足开发者这方面的需求. 二 自定义控件样式切换 自定义控件样式,顾名思义是我们开发者要求的自定义,因为它与开发的应用本

Android 插件化开发-主题皮肤更换

参考 http://www.2cto.com/kf/201501/366859.html 本项目是以插件化开发思想进行的,主要工作和代码如下 资源文件,这里以color资源为例 1.首先我们需要准备一个皮肤包,这个皮肤包里面不会包含任何Activity,里面只有资源文件,这里我为了简单,仅仅加入一个color.xml(其实就相当于Android系统中的framework_res.apk) <!--?xml version="1.0" encoding="utf-8&qu

Android 下实现通用自启动守护实现

1.Android 操作系统架构 Android 系统分为四个层,从高到底分别是:应用程序层(Application).应用程序 框架层(Application Framework).系统运行库层(Libraries)和 Linux 内核层(Linux Kernel). Android 操作系统最底层还是 Linux 内核,我们就从 Linux 内核开始着手. 2.Linux 配置自启动原理 Linux 加载后, 将初始化硬件和设备驱动, 然后运行第一个进程 init.init 根据配置文件继续

jQuery实现无刷新切换主题皮肤功能

jQuery实现无刷新切换主题皮肤功能 helloweba.com 作者:月光光 时间:2010-12-13 12:49 主题皮肤切换功能在很多网站和系统中应用,用户可以根据此功能设置自己喜欢的主题颜色风格,增强了用户体验.本文将围绕如何使用jQuery实现点击无刷新切换主题皮肤功能. 查看演示 实现该功能的原理就是通过点击定义的主题样式,改变页面当前引用的主题CSS文件,并且将当前的主题样式写入cookie中或者写入数据库中,以便下次该用户重新访问页面时,调用的就是上次设置好的主题样式. 准备

关于android 使用bitmap的OOM心得和解决方案

android开发,从2010年开始学习到现在的独立完成一个app,这漫长的四年,已经经历了很多次bug的折磨,无数次的加班训练.然而,自以为自己已经比较了解android了,却最近在一个项目上,因为oom而折腾了一个周,回到原地,认识了自己的不足,感觉自己是如此的菜鸟呀. 好了,不废话,大家在使用开发android的时候,很少会注意或者意识到释放内存的重要性,因为大家在使用过程中,涉及的图片资源不多,或者比较稳定,来回切换界面,图片也就那么几张或者使用的都是很小的图片,根本不会感觉到图片占用内

iOS程序框架设计之皮肤切换功能 (白天与夜间效果)

iOS程序框架设计之皮肤切换功能 一.引言 移动应用的开发中,有时我们会需要例如更换皮肤此类的功能,andorid采用xml配置UI的方式,这个问题或许还容易解决些,iOS的主要UI逻辑则是在代码中控制的,如果没有一个强大的框架方案,这个问题将变得非常棘手.网上也有很多诸如此类功能的优秀案例与框架,在这篇博客中,我与大家分享下我的解决方案,其中如果有不恰或者糟糕之处,希望与高人一起交流. 二.设计思路与框架 首先我的设计思路是采用通知的方式,原理可以如下理解为以下几步: 1.在系统的通知中心注册

Android下WiFiDisplay功能探究

1 WiFiDisplay简介 1.1WiFiDisplay概述 WiFiDisplay(WFD)是WiFi联盟在已有技术的基础上,为了加速视/音频的传输分享而提出来的一个新概念.WiFi联盟对此成立了一个认证项目:Miracast-- 用来认证一个设备是否支持WiFiDisplay功能. 下图是WiFiDisplay功能的技术支撑体系,实际上最重要的部分就是WiFi Direct:也就是两个设备无需AP(AccessPoint)的情况下直接相连,这就奠定了两个带WiFi功能的设备能够随时传递高

Android 样式 (style) 和主题(theme)

转载:https://gold.xitu.io/post/58441c48c59e0d0056a30bc2 样式和主题 样式是指为 View 或窗口指定外观和格式的属性集合.样式可以指定高度.填充.字体颜色.字号.背景色等许多属性. 样式是在与指定布局的 XML 不同的 XML 资源中进行定义. Android 中的样式与网页设计中层叠样式表的原理类似 - 您可以通过它将设计与内容分离. 例如,通过使用样式,您可以将以下布局 XML: <TextView android:layout_width