Weex –Android学习
标签(空格分隔): weex 拓展Android
一、拓展Android的功能:
Module
拓展非ui的特定功能 ( WXModule )component
拓展实现特别功能的Native控件( WXComponent)Adapter
拓展Weex对一些基础功能实现了统一的接口,可实现这些接口来定制自己的业务。
二、WXSDKEngine
是 Weex 对外的总入口。
- 设置相关 Adapter 和获取 adapter。
- 注册自定义 module 和 component
- 重置 JSFramework
三、Native和JS通信
- 自定义事件通知(多用于某个自定义控件进行事件通知,例如自定义点击事件,响应下拉事件等。)
public void fireEvent(String elementRef,final String type, final Map<String, Object> data,final Map<String, Object> domChanges){ }
public void fireEvent(String elementRef,final String type, final Map<String, Object> data){
fireEvent(elementRef,type,data,null);
}
public void fireEvent(String elementRef, String type){
fireEvent(ref,type,new HashMap<String, Object>());
}
elementRef
:事件发生的控件 ID。
type
: 自定义事件,Weex 默认以 onXxxxx 开头为自定义事件。onPullDown (下拉事件)。
data
: 需要透出的参数,例如当前控件的大小,坐标等其他信息。
domChanges
:更新 ref 对应控件的 Attribute 和 Style。
2. 事件回调(多用于 Module 回调,例如定位 Module 完成后需要通知 JS)
public class WXLocation extends WXModule {
@JSMethod
public void getLocation(JSCallback callback){
//获取定位代码.....
Map<String,String> data=new HashMap<>();
data.put("x","x");
data.put("y","y");
//通知一次
callback.invoke(data);
//持续通知
callback.invokeAndKeepAlive(data);
//invoke方法和invokeAndKeepAlive两个方法二选一
}
}
ps:其中JsCallback
就是事件回调的接口
3. 注册滑动事件
Weex 获取滑动事件可以通过WXSDKInstance
注册 registerOnWXScrollListener
监听
4. 动态适配容器
5. 使用WXSDKInstance.setSize(int width, int height)
来改变容器的大小。
/**
*
* @param width 容器宽度
* @param height 容器高度
*/
public void setSize(int width, int height){};
四、WXComponent
initComponentHostview
create一个view,然后将view返回给自定义view
2.1 weex-iOS插件扩展方式介绍
五、iOS组件Component扩展步骤
iOS端
1. 创建自定义的组件继承WXComponent
类
2. 重写- (instancetype)initWithRef:(NSString )ref type:(NSString )type styles:(NSDictionary )styles attributes:(NSDictionary )attributes events:(NSArray )events weexInstance:(WXSDKInstance )weexInstance方法
3. 现实自定义的UI样式
4. 支持js方法在特殊的状态调用重写addEvent和removeEvent方法,在需要的位置调用fireEvent方法执行对应的js方法
5. 支持js调模块扩展出来的方法,编写扩展方法WX_EXPORT_METHOD(@selector(method))扩展
6. 使用WXSDKEngine的+registerComponent:withClass:去注册
js端
1. 直接在需要该组件的template中使用
2. 如果组件需要传递参数,则可以通过:key=value的形式传递,方法@methodName=JSmethod,实现js方法
3. 调用扩展方法:this.$refs.refName.methodName
iOS模块Module扩展步骤
iOS端
1. 创建自定义的模块实现协议
2. 实现自定义的功能并callback回调给js
3. 使用WX_EXPORT_METHOD或WX_EXPORT_METHOD_SYNC来抛出native方法给js
4. 使用WXSDKEngine的+registerModule:withClass:去注册
js端
1. 直接在需要该组件的script中使用weex.requireModule()获得已注册的模块
2. 在需要的位置调用注册的方法
六、weex-android插件扩展方式介绍
android组件Component扩展步骤
android端
1. 创建自定义的组件继承WXComponent
/WXVContainer
类
2. 使用initComponentHostView(context)
初始化,initView()方法已过时
3. 现实自定义的UI样式, 通过添加注解@WXComponentProp
设置属性
4. 使用instance.fireEvent()
方法执行对应的js方法
5. 支持js调模块扩展出来的方法,编写扩展方法@JSMethod(uiThread = false或true)
扩展
6. 使用WXSDKEngine
的WXSDKEngine.registerComponent()
去注册
js端
1. 直接在需要该组件的template
中使用
2. 如果组件需要传递参数,则可以通过:key=value的形式传递,方法@methodName=JSmethod
,实现js方法
3. 调用扩展方法:this.$refs.refName.methodName
七、android模块Module扩展步骤
android端
- 创建自定义的模块继承
WXModule
- 实现自定义的功能并
callback
回调给js - 使用
@JSMethod(uiThread = false或true)
将自定义的方法抛给js - 使用
WXSDKEngine
的WXSDKEngine.registerModule()
去注册
js端
- 直接在需要该组件的script中使用weex.requireModule()获得已注册的模块
- 在需要的位置调用注册的方法
八、web组件Component扩展步骤
js端
1.使用npm install加载weex-vue-render组件
2.使用Weex.registerComponent(‘name’, component); 注册组件
3.在webpack.config中使用weex.install(components)加载所有组件
4.调用扩展方法:
web组件Module扩展步骤
js端
1. 使用npm install加载weex-vue-render组件
2. 使用Weex.registerModule(‘name’, module)
3. 在webpack.config中使用weex.install(modules)加载所有组件
4.调用扩展方法:const moduleName = weex.requireModule(‘ModuleName’); 调用模块方法moduleName.xx()
九、Weex 交互(有相关经验的小伙伴可忽略)
3.1 Weex-web和native交互(iOS
使用WKWebView
,android
使用WebView
)
Weex-web端
Weex-web调用native提供的方法:
iOS:webkit.messageHandlers.weexCallHandler.postMessage(data)
android:window.dianwoda.weexCallHandler(data);
解决方案:使用callHandler的调用方式来实现
参数:
a.name
:调用native的方法名,即约定的具体需要调用native的什么方法,例:setHeaderTitle(设置header的title)
b.params
:传给native端的参数,例:{‘title’: ‘这是商品详情页的标题’}
c.onSuccess
:调用native方法成功后的回调方法名
d.onFail
:调用native的方法名,即约定的具体需要调用native的什么方法,例:setHeaderTitle(设置header的title)问题:由webpack打包生成的Weex-web的vuejs文件的methods方法不在window下native无法调用到,
解决方案:
var hybrid = {}
if (weex.config.env.platform === 'Web') {
window.Hybrid = hybrid
}
将方法绑到window下面才能调到
iOS端
1. iOS调用Weex-web的方法回传数据:[webView evaluateJavaScript:jsStr completionHandler:^(id _Nullable d, NSError * _Nullable error) {}];
android端
1.. android调用Weex-web的方法回传数据:通过getSettings()获得WebSettings,然后用setJavaScriptEnabled()调用Js
十、Weex和iOS交互
- Weex调用iOS的方法
方式1:通过iOS注册的Module方式来抛出方法供weex调用 iOS调用weex的方法
方式1:拿到weex页面的instanceId通过fireEvent方法调用weex方法
如:[[WXSDKManager bridgeMgr] fireEvent:weexInstance.instanceId ref:WX_SDK_ROOT_REF type:type params:params domChanges:nil];方式2:在组件中使用fireEvent方法来调用weex方法
方式3:使用fireGlobalEvent来通知调用weex方法
注:fireEvent方式是通过JSContext实现,fireGlobalEvent是通过通知实现
十一、Weex和android交互
1.Weex调用android的方法
方式1:通过android注册的Module方式来抛出方法供weex调用
- android调用weex的方法
方式1:拿到weex页面的instance通过fireEvent(getRef(), numClick, data, null);方法来调用weex方法
方式3:使用fireGlobalEvent来广播调用weex方法
注:fireEvent方式是通过webView调用js实现,fireGlobalEvent是通过广播实现