Android4.4+方法
如果你項(xiàng)目的minSdkVersion 為4.4 以上,那么你可以直接通過WebView的evaluateJavascript()方法 拿到JS方法的返回值
mWebView.evaluateJavascript("javascript:JSMethod()", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
//此處為 js 返回的結(jié)果
}
});
}
兼容Android4.4 以下
但是市場(chǎng)上4.4以下的機(jī)型占有率還是很高的,而你的minSdkVersion 又是在4.4以下,那么你就不得不做適配
除了以上方法可以調(diào)用JS方法,還有一種傳統(tǒng)的方法也可以調(diào),那就是通過WebView的loadUrl()。
但是該方法不直接返回JS方法的返回值,我們可以使用一些小技巧間接的獲取該JS方法的返回值。
例如,我們通常是這么調(diào)用一個(gè)JS的 方法
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url); //*
webView.loadUrl("javascript:JSMethod('" + userId + "')");
}
});
但該JS方法沒有添加回調(diào)原生的函數(shù)時(shí),我們是獲取不到該方法的返回值
那么我們就得換一種方式,直接調(diào)用JS的alert方法將JS方法的返回值提示給我們,alert出來的message就是我們要獲取的返回值。
將上面調(diào)用JS方法的地方改一下:
webView.loadUrl("javascript:alert(JSMethod('" + userId + "'))");
拿到JSAlert返回的消息并處理提示框
webview.setWebChromeClient(
new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
Logger.e(message);
result.confirm();
return true;
}
);
這樣既能調(diào)用到JS方法,也能拿到該JS 方法的返回值,當(dāng)然如果你加載的這個(gè)H5 頁面有其他的alert也是會(huì)在這里回調(diào)的,至于怎么處理就見仁見智了,例如你可以給個(gè)flag啊...
注意事項(xiàng):
1.加載完H5 之后再調(diào)用JS方法,所以你的JS方法可以寫在onPageFinished里面,而且要在父類方法后面執(zhí)行。
2.自行處理alert回調(diào)時(shí),要執(zhí)行result.confirm();或JSResult的其他方法告訴H5我處理完了,return true表示我們攔截了系統(tǒng)的alert提示;