现在有一个需求:根据页面传来的json,初始化android界面中的toolbar。
那么就来使用JsBridge吧
implementation 'com.github.lzyzsd:jsbridge:1.0.4' // js和android交互框架
导入JsBridge项目,在布局中加入一个webview,然后来到代码:
bridgeWebView= activity.findViewById(R.id.webView);
bridgeWebView.setWebChromeClient(chromeClient); // 按需求配置
BridgeWebViewClient webViewClient = new BridgeWebViewClient(bridgeWebView){
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
progressBar.setVisibility(View.VISIBLE);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
bridgeWebView.send("发送 向js请求初始化", new CallBackFunction() {
@Override
public void onCallBack(String data) {
Bean_WebInit bean_webInit = new Gson().fromJson(data.toString(), new TypeToken<Bean_WebInit>(){}.getType());
//
Message message = Message.obtain();
message.what = UPDATE_TOOLBAR;
message.obj = bean_webInit;
handler.sendMessage(message);
}
});
}
};
bridgeWebView.setWebViewClient(webViewClient);
bridgeWebView.loadUrl(url);
大头来了,重点是 BridgeWebViewClient这个设定,一般设置WebView的onPageFinished是用WebViewClient这个类的,可是BridgeWebView这个控件可能WebViewClient被覆盖了,所以只能覆写BridgeWebViewClient来实现onPageFinished来实现页面加载完成的回调。
而send方法两个参数,第一个参数是发送给js,让js处理的,第二个参数则是js回调给android的数据,其中的参数data就是js返回的了。
忘了说了,在js中要配合android写初始化配置:
//注册回调函数,第一次连接时调用 初始化函数
connectWebViewJavascriptBridge(function(bridge) {
//初始化
bridge.init(function(message, responseCallback) {
var data = {
'btn_type': 'link',
'url': 'https://www.baidu.com',
'is_right_btn_show': true
};
responseCallback(data);
});
})
//JS注册事件监听
function connectWebViewJavascriptBridge(callback) {
if (window.WebViewJavascriptBridge) {
callback(WebViewJavascriptBridge)
} else {
document.addEventListener(
'WebViewJavascriptBridgeReady'
, function() {
callback(WebViewJavascriptBridge)
},
false
);
}
}
而js这边呢,我基本就看不懂了,反正把要传的键值对写到data参数里就是了。
ok,就是这样,更多的也不懂了。以上都是一个编程经验1年的萌新写的,有问题请指出。