本文将介绍如何在CC框架下实现Fragment和View的组件化。java
在android组件化过程当中,你有没有遇到这样的问题:android
CC的参数和回调结果使用的数据结构是Map,在app内部能够传递任何类型。数据结构
经过CC调用获取组件中的Fragment对象架构
1.1 组件调用方按以下方式调用,并从回调结果中获取Fragment,例如:app
Fragment fragment = CC.obtainBuilder("ComponentName")
.build().call().getDataItem("key");
if (fragment != null) {
//show fragment
}
复制代码
1.2 组件实现方按以下方式设置结果,例如:框架
CC.sendCCResult(cc.getCallId(), CCResult.success("key", new MyFragment()));
复制代码
与Fragment进行通讯ide
组件化实施的主要目的之一是业务隔离:只暴露调用协议给外部(相似于app端与服务端的通讯接口),内部实现的更改对外部无影响。甚至组件的插拔和替换都不影响调用方(只要组件调用方作好组件调用失败的降级处理,例如1.1示例代码中的if (fragment != null) {...}
。)组件化
因此,Fragment中的具体业务逻辑应由组件自身内部来实现,在组件调用方(如:Activity)中经过CC调用组件暴露的接口来完成。post
2.1 组件调用方将fragment对象及其它参数经过CC传递给组件,例如:ui
boolean success = CC.obtainBuilder("ComponentName")
.setActionName("updateTextView") //action名称
.addParam("fragment", fragment) //目标fragment对象
.addParam("value", text) //设置参数
.build().call().isSuccess();
复制代码
2.2 组件中接收fragment对象及其它参数,并调用fragment对象的指定方法实现对应的业务,例如:
@Override
public boolean onCall(CC cc) {
String actionName = cc.getActionName();
if ("updateTextView".equals(actionName)) {
MyFragment fragment = cc.getParamItem("fragment");//接收fragment对象
if (fragment != null) {
String text = cc.getParamItem("value", "");//接收其它参数
fragment.updateText(text);//调用fragment的方法
CC.sendCCResult(cc.getCallId(), CCResult.success());//回调结果
} else {
//回调错误信息
CC.sendCCResult(cc.getCallId(), CCResult.error("no fragment params"));
}
}
return false;
}
复制代码
答案是:对于一些封装过的View、自定义View(特别是第三方自定义View)是有必要的。
理由是:组件化能很好的解耦,将业务实现彻底交给组件内部完成,只要接口协议不发生变化,实现方式发生改变时不会影响到使用方式。
网上不少组件化方案中,都是将自定义View(本身写的或者第三方库)做为公共库来使用。若是没有作个适配层(Adapter)而直接使用自定义View的类,将会致使View的耦合度很高,下降系统的扩展性。
与Fragment组件化同样,经过CC获取对象和业务调用。
惟一的差异是:在获取View对象时须要将Activity对象传给组件
View view = CC.obtainBuilder("ComponentName")
.setContext(activity) //将activity对象传给组件,用于View的初始化
.build().call().getDataItem("key");
if (view != null) {
//add view to container
}
复制代码
关于android的组件化文章通常都只是介绍如何进行Activity的跳转及服务调用,对于Fragment的组件化一直没有很好的解决,View的组件化几乎没有被提到。
本文介绍了在CC组件化框架下实现Fragment及View组件化的方式,为android工程组件化的道路扫除一个障碍。