有道云笔记贴过来的代码有点乱,请参考 原文
webview调用html js完全攻略(所有的疑问都能解答)
设置webSettings
//允许h5使用javascript
webView.getSettings().setJavaScriptEnabled(true);
//允许android调用javascript
webView.getSettings().setDomStorageEnabled(true);
设置调用javascript
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url) {
webView.loadUrl("javascript:alert('hello')");
webView.loadUrl("javascript:androidCallBack()");
}
}
一定要放在onPageFinished中,保证webview已经加载完毕,再调用js。
上面通过android调用js的弹窗功能。这也是我们常用的js测试功能。
现在可以说配置完成了,当我们运行上面代码,发现并没有alert数据(或者console数据),这也是困扰我比较长时间的地方。
最后发现,android要获取javascript的弹窗功能(或console)功能,有单独的方法调用。
捕获弹窗(或console)
webView.setWebChromeClient(new WebChromeClient(){
@Override
public boolean onConsoleMessage(ConsoleMessage cm) {
Log.d("test", cm.message() + " -- From line " + cm.lineNumber() + " of " + cm.sourceId() );
return true;
}
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Log.d("alert",message);
return true;
}
});
加上配置后继续运行。这时发现弹窗的数据的确打印了,不过H5的界面却没显示出来,经过查阅,了解到,webview捕获alert函数后会卡死,需要释放。
修改代码如下:
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Log.d("alert",message);
//劫持alert以后释放,不然会卡死
result.confirm();
return true;
}
再次运行,显示成功。
补充说明下,当时使用fragement加载,需要在切换fragement的时候webview调用js。而fragementmanager的show和hide方法,并不会调用fragement的生命周期函数,经过查阅文档,发现会调用,onHiddenChanged方法,于是问题得到解决。
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (hidden) {// 不在最前端界面显示
} else {// 重新显示到最前端中
webView.evaluateJavascript("javascript:androidCallBack()",null);
}