用Weex開發Android程序
1、創建Android工程
2、集成WeexSDK,參考[WEEX SDK 集成到 Android 工程](https://weex-project.io/cn/doc/advanced/integrate-to-android.html)
3、開發.we源碼
4、編譯.we源碼為js文件,將js文件復制到Android工程的asset目錄下
5、初始化sdk
6、實現渲染
WXSample地址 https://github.com/xkli/WXSample.git
Weex擴展到Android(自定義組件)
自定義組件(Android)
1.自定義組件必須繼承自 WXComponent 或者 WXContainer ;
2.weex SDK 可以識別 @WXComponentProp (name = value(value 是 attr 或者 dsl style));
3.方法必須是 public 的;
4.組件類不能是一個內部類;
5.自定義組件不能被 ProGuard 之類的工具混淆;
6.組件方法在 UI 線程被調用,因此不要在里面進行耗時的操作;
7.Weex 的參數類型可以是 int, double, float, String, Map, List 和實現了 WXObject 接口的自定義類;
參考以下例子:
package com.taobao.weex.ui.component;
// ……
public class MyViewComponent extends WXComponent{
public MyViewComponent(WXSDKInstance instance, WXDomObject node,
WXVContainer parent, String instanceId, boolean lazy) {
super(instance, node, parent, instanceId, lazy);
}
@Override
protected void initView() {
//TODO:your own code ……
}
@Override
public WXFrameLayout getView() {
//TODO:your own code ………
}
@WXComponentProp(name=WXDomPropConstant.WX_ATTR_VALUE)
public void setMyViewValue(String value) {
((TextView)mHost).setText(value);
}
}
必須注冊組件:
WXSDKEngine.registerComponent("MyView", MyViewComponent.class);
自定義原生API
Weex 的 SDK 只提供了頁面渲染的能力,但是一些其它操作,比如網絡請求、圖片加載、重定向等功能需要你自己去實現,這個例子講述了如何用原生代碼去擴展 Weex 的功能。
關於 URLHelper 的例子
新建一個 WXModule
public class URLHelperModule extends WXModule{
private static final String WEEX_CATEGORY="com.taobao.android.intent.category.WEEX";
@JsMethod
public void openURL(String url){
if (TextUtils.isEmpty(url)) {
return;
}
StringBuilder builder=new StringBuilder("http:");
builder.append(url);
Uri uri = Uri.parse(builder.toString());
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.addCategory(WEEX_CATEGORY);
mWXSDKInstance.getContext().startActivity(intent);
}
}
這里要注意 @JsMethod 這個注解,它表示了你把這個方法暴露給 JavaScript。
public class URLHelperModule extends WXModule{
@JsMethod
public void openURL(String url,String callbackId){
//...
//callback to javascript
Map<String, Object> result = new HashMap<String, Object>();
result.put("ts", System.currentTimeMillis());
WXBridgeManager.getInstance().callback(mWXSDKInstance.getInstanceId(), callbackId, result);
}
}
把module注冊到WXSDKEngine:
try {
WXSDKEngine.registerModule("myURL", URLHelperModule.class);
//'myURL' is the name you'll use in javascript
} catch (WXException e) {
WXLogUtils.e(e.getMessage());
}
在 JavaScript 中使用 eventModule:
let URLHelper = require('@weex-module/myURL');//same as you registered
URLHelper.openURL("http://www.taobao.com",function(ts){
console.log("url is open at "+ts);
});
一些注意事項:
定義一個 components 需要繼承 WXModule
不要忘記添加 @WXModuleAnno 注解,不然 Weex 沒法識別這個方法
定義的方法必須是 `public 的
module 類一定不能是內部類
你定義的 components 不能被混淆,不然會找不到
Module 中的方法會在 UI 線程中被調用,所以一定不要做一些耗時操作
Moudle 中的方法參數類型可以為 int,double,float,String,Map,List,以及實現 WXObject 接口的類。