本文將介紹如何在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工程組件化的道路掃除一個障礙。