在Android项目中我们或多或少会涉及到与js交互的问题,这其中WebView是必须掌握的控件,今天主要说说我们通过WebView调用js方法,然后如何很好的获取返回值。这里我总结了三种方式,大家可根据需求选择。
一、Android版本在4.4及以上
mWebView.evaluateJavascript("javascript:jsMethod()", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
//value即为js返回值
}
});
如果你项目最低支持版本在4.4以上,那这种方式最简单最完美,否则会报以下警告:
Call requires API level 19 (current min is 14): android.webkit.WebView#evaluateJavascript
二、Android4.4以下版本
虽说现在4.4以下版本不多了,但是只要存在,我们就需要努力兼容。
第一步,利用WebView的loadUrl()方法,调用js的alert方法,
mWebView().loadUrl("javascript:alert(jsMethod())");
第二步,在alert回调中的message就是我们想要的返回值
mWebView.setWebChromeClient(
new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
//message即为返回值
result.confirm();
return true;
}
);
返回值虽然拿到了,但是这种方法缺点挺多的:
1、不能忘记在回调中调用result.confirm,否则webview会出现奇怪的不可控现象,大家可以去掉试试;
2、onJsAlert方法要return true,表示我们自己处理alert,不需要js管啦;
3、js在alert方法中别return一个值回来,否则也会出现奇怪现象;
4、在华为Android版本8.0以上的某些机型中,会出现无法拦截js的alert,会直接将js的alert弹框弹出,很难受。。。
三、最稳妥的方法
这种方法需要和js协调好,双方配合完成:
1、我们同样利用WebView的loadUrl()方法,调用js普通方法
mWebView().loadUrl("javascript:jsMethod()");
2、给js注入一个方法,且加入参数,并和js开发人员约定,当我们调用其第一步中的jsMethod方法,他调用我们注入的方法,并将返回值传回
mWebView().addJavascriptInterface(this, "viewpager");
@JavascriptInterface
public void getResult(String str) {
//str 即为返回值
}
OK!搞定啦,到此你就可以开心的与js交互,并拿到他的返回值啦!希望我的总结可以帮助到你~