前言
我才知道weex module中还包括个webview,那就介绍下webview吧,是一个web操作相关的api~
代码解读
weex code
goBack(ref) : 加载前一个webview堆栈历史
Arguments
ref(string): webview 控件的引用.
Example
var webview = require('@weex-module/webview');
// 得到webview元素
var webElement = this.$el('webview');
webview.goBack(webElement.ref);
goForward(ref) :加载下一个webview堆栈历史
Arguments
ref(string) : webview 控件的引用.
Example
var webview = require('@weex-module/webview');
var webElement = this.$el('webview');
webview.goForward(webElement.ref);
reload(ref) : 重新加载当前webpage
Arguments
ref(string) : webview 控件的引用.
Example
var webview = require('@weex-module/webview');
var webElement = this.$el('webview');
webview.reload(webElement.ref);
android code
1、注册 :
// 注册 webview module
WXModuleManager.registerModule("webview", WXWebViewModule.class, true);
// 注册 webview 组件
registerComponent("web", WXWeb.class);
2、WXWebViewModule
public class WXWebViewModule extends WXModule {
private enum Action {
reload,
goBack,
goForward
}
@WXModuleAnno
public void goBack(String ref) {
action(Action.goBack, ref);
}
@WXModuleAnno
public void goForward(String ref) {
action(Action.goForward, ref);
}
@WXModuleAnno
public void reload(String ref) {
action(Action.reload, ref);
}
private void action(Action action, String ref) {
WXWeb webComponent = (WXWeb) WXSDKManager.getInstance().getWXRenderManager()
.getWXComponent(mWXSDKInstance.getInstanceId(), ref);
webComponent.setAction(action.name());
}
}
3、WXWeb
public class WXWeb extends WXComponent {
protected IWebView mWebView;
private String mUrl;
private boolean mUrlChanged;
public WXWeb(WXSDKInstance instance, WXDomObject dom, WXVContainer parent,
String instanceId, boolean isLazy) {
super(instance, dom, parent, instanceId, isLazy);
createView();
}
// 创建
protected void createView(){
mWebView = new WXWebView(mContext);
}
@Override
protected void initView() {
mWebView.setOnErrorListener(new IWebView.OnErrorListener() {
@Override
public void onError(String type, Object message) {
fireEvent(type, message);
}
});
mWebView.setOnPageListener(new IWebView.OnPageListener() {
@Override
public void onReceivedTitle(String title) {
if (mDomObj.event != null &&
mDomObj.event.contains(WXEventType.WEBVIEW_RECEIVEDTITLE)) {
Map<String, Object> params = new HashMap<>();
params.put("title", title);
WXSDKManager.getInstance()
.fireEvent(mInstanceId, getRef(), WXEventType.WEBVIEW_RECEIVEDTITLE, params);
}
}
@Override
public void onPageStart(String url) {
if (mDomObj.event != null && mDomObj.event.contains(WXEventType.WEBVIEW_PAGESTART)) {
Map<String, Object> params = new HashMap<>();
params.put("url", url);
WXSDKManager.getInstance()
.fireEvent(mInstanceId, getRef(), WXEventType.WEBVIEW_PAGESTART, params);
}
}
@Override
public void onPageFinish(String url, boolean canGoBack, boolean canGoForward) {
if (mDomObj.event != null &&
mDomObj.event.contains(WXEventType.WEBVIEW_PAGEFINISH)) {
Map<String, Object> params = new HashMap<>();
params.put("url", url);
params.put("canGoBack", canGoBack);
params.put("canGoForward", canGoForward);
WXSDKManager.getInstance()
.fireEvent(mInstanceId, getRef(), WXEventType.WEBVIEW_PAGEFINISH, params);
}
}
});
mHost = mWebView.getView();
}
@Override
public void flushView() {
super.flushView();
if (!TextUtils.isEmpty(mUrl) && mUrlChanged) {
mUrlChanged = false;
loadUrl(mUrl);
}
}
@Override
public void destroy() {
super.destroy();
getWebView().destroy();
}
// is show loading
@WXComponentProp(name = "show-loading")
public void setShowLoading(boolean showLoading) {
getWebView().setShowLoading(showLoading);
}
// url
@WXComponentProp(name = "src")
public void setUrl(String url) {
if (TextUtils.isEmpty(url) || mHost == null) {
return;
}
mUrl = url;
mUrlChanged = true;
}
// 意图处理
public void setAction(String action) {
if (!TextUtils.isEmpty(action)) {
if (action.equals("goBack")) {
goBack();
} else if (action.equals("goForward")) {
goForward();
} else if (action.equals("reload")) {
reload();
}
}
}
private void fireEvent(String type, Object message) {
if (mDomObj.event != null && mDomObj.event.contains(WXEventType.WEBVIEW_ERROR)) {
Map<String, Object> params = new HashMap<>();
params.put("type", type);
params.put("errorMsg", message);
WXSDKManager.getInstance()
.fireEvent(mInstanceId, getRef(), WXEventType.WEBVIEW_ERROR, params);
}
}
private void loadUrl(String url) {
getWebView().loadUrl(url);
}
private void reload() {
getWebView().reload();
}
private void goForward() {
getWebView().goForward();
}
private void goBack() {
getWebView().goBack();
}
private IWebView getWebView() {
return mWebView;
}
}
4、WXWebView
public class WXWebView implements IWebView {
private Context mContext;
private WebView mWebView;
private ProgressBar mProgressBar;
private boolean mShowLoading = true;
private OnErrorListener mOnErrorListener;
private OnPageListener mOnPageListener;
public WXWebView(Context context) {
mContext = context;
}
@Override
public View getView() {
FrameLayout root = new FrameLayout(mContext);
root.setBackgroundColor(Color.WHITE);
mWebView = new WebView(mContext);
FrameLayout.LayoutParams wvLayoutParams =
new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT);
wvLayoutParams.gravity = Gravity.CENTER;
mWebView.setLayoutParams(wvLayoutParams);
root.addView(mWebView);
initWebView(mWebView);
mProgressBar = new ProgressBar(mContext);
showProgressBar(false);
FrameLayout.LayoutParams pLayoutParams =
new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,
FrameLayout.LayoutParams.WRAP_CONTENT);
mProgressBar.setLayoutParams(pLayoutParams);
pLayoutParams.gravity = Gravity.CENTER;
root.addView(mProgressBar);
return root;
}
@Override
public void destroy() {
if (getWebView() != null) {
getWebView().removeAllViews();
getWebView().destroy();
mWebView = null;
}
}
@Override
public void loadUrl(String url) {
getWebView().loadUrl(url);
}
@Override
public void reload() {
getWebView().reload();
}
@Override
public void goBack() {
getWebView().goBack();
}
@Override
public void goForward() {
getWebView().goForward();
}
@Override
public void setShowLoading(boolean shown) {
mShowLoading = shown;
}
@Override
public void setOnErrorListener(OnErrorListener listener) {
mOnErrorListener = listener;
}
@Override
public void setOnPageListener(OnPageListener listener) {
mOnPageListener = listener;
}
private void showProgressBar(boolean shown) {
if (mShowLoading) {
mProgressBar.setVisibility(shown ? View.VISIBLE : View.GONE);
}
}
private void showWebView(boolean shown) {
mWebView.setVisibility(shown ? View.VISIBLE : View.INVISIBLE);
}
private WebView getWebView() {
return mWebView;
}
private void initWebView(WebView wv) {
// 初始化
WebSettings settings = wv.getSettings();
settings.setJavaScriptEnabled(true);
settings.setAppCacheEnabled(true);
settings.setUseWideViewPort(true);
settings.setDomStorageEnabled(true);
settings.setSupportZoom(false);
settings.setBuiltInZoomControls(false);
// 设置客户端
wv.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
WXLogUtils.v("tag", "onPageOverride " + url);
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
WXLogUtils.v("tag", "onPageStarted " + url);
if (mOnPageListener != null) {
mOnPageListener.onPageStart(url);
}
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
WXLogUtils.v("tag", "onPageFinished " + url);
if (mOnPageListener != null) {
mOnPageListener.onPageFinish(url, view.canGoBack(), view.canGoForward());
}
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request
, WebResourceError error) {
super.onReceivedError(view, request, error);
if (mOnErrorListener != null) {
mOnErrorListener.onError("error", "page error");
}
}
@Override
public void onReceivedHttpError(WebView view, WebResourceRequest request,
WebResourceResponse errorResponse) {
super.onReceivedHttpError(view, request, errorResponse);
if (mOnErrorListener != null) {
mOnErrorListener.onError("error", "http error");
}
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
super.onReceivedSslError(view, handler, error);
if (mOnErrorListener != null) {
mOnErrorListener.onError("error", "ssl error");
}
}
});
// 设置浏览器客户端
wv.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
showWebView(newProgress == 100);
showProgressBar(newProgress != 100);
WXLogUtils.v("tag", "onPageProgressChanged " + newProgress);
}
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
if (mOnPageListener != null) {
mOnPageListener.onReceivedTitle(view.getTitle());
}
}
});
}
}
1、WXWebViewModule 接收到意图指令,命令WXWeb执行指令;
2、WXWeb 通过IWebView 获取到WXWebView 对象,通知WXWebView 执行指令;
3、部分重要操作都已标明注释;