一般Android原生与Js互调,一种是js调Android原生给Android传值,一种是Android调Js方法给html传值刷新网页,
还有一种需求 就是怎么在webview加载html网页时获取网页中定义的变量?
比如下面html页面内容,有一个全局的变量des
,然后在webview加载该网页时,需要拿到des
的值在网页外部使用。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script type="text/javascript">
var des ; //全局变量des
</script>
</body>
</html>
实现方法是:采用Android调用JS的方法,进行赋值获取,在onPageFinished
方法中通过view.loadUrl("javascript:window.java_obj.getDes(des);");
调用给html自定义的getDes(des)
方法,其中参数des
为网页中的变量名,实现代码如下:
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
// 获取页面内容
view.loadUrl("javascript:window.java_obj.getDes(des);"); // des为html页面中的一个变量
}
});
接下来通过在WebView初始化的时候添加Js接口,获取getDes(des)
中的参数值,实现如下:
/**
* 添加javascriptInterface
* 第一个参数:这里需要一个与js映射的java对象
* 第二个参数:该java对象被映射为js对象后在js里面的对象名,在js中要调用该对象的方法就是通过这个来调用
*/
mWebView.addJavascriptInterface(new JavaScriptObj(), "java_obj");
接下来定义接口类JavaScriptObj
,从而获取到html中的变量值
public final class InJavaScriptLocalObj {
@JavascriptInterface
public void getDes(String des) {
//des 即为 html 文件中的变量参数值
}
}
注意的是:
自定义js方法一定要在页面加载完成的方法
onPageFinished
中去调用,避免html页面中des
还未赋值成功,而导致获取不到值的情况。