Android 中通过WebView和HTML实现JS交互
Android(Java)与JavaScript(HTML)交互有四种情况:
1) Android(Java)调用HTML中js代码
2) Android(Java)调用HTML中js代码(带参数)
3) HTML中js调用Android(Java)代码
4) HTML中js调用Android(Java)代码(带参数)
注意:
上面四种调用方式,android和Html一定要保持一样,否则JS调不通,比如Html调用android,不带参数。如果android代码中,调用方法中带了参数。是调不通的。
1、设置webview支持JavaScript:
webSettings.setJavaScriptEnabled(true);
2、JS接口名称jsObj 要与后台保持一致。否则调不通
void android.webkit.WebView.addJavascriptInterface(Object obj, String interfaceName)
Android :
mWebView.addJavascriptInterface(getHtmlObject(), "jsObj");
Html :
var str = window.jsObj.HtmlcallJava();
//jsObj 就是Android中addJavaScriptInterface 中的第二个参数,接口名称。
// HtmlcallJava 就是<span style="font-family: Arial, Helvetica, sans-serif;">Android中addJavaScriptInterface 第一个参数的方法中的一个方法名称。
3、自己测试HTML页面和android的交互,可以把Html文件放到本地assets文件夹中,用webview load这个Html文件。
mWebView.loadUrl("file:///android_asset/index.html");
4、android 调用 HTML 中的方法,不带参,带一个参数,带两个参数的格式
mWebView.loadUrl("javascript:showFromHtml()"); // 不带参数
mWebView.loadUrl("javascript:showFromHtml2('Hello world')"); // 带一个参数
String strData;
String strObjId;
String callJs = "javascript:returnImagePath('" + strData + "', '" + strObjId + "')"; //带两个参数
webView.loadUrl(callJs);
5、mWebView.addJavascriptInterface(getHtmlObject(), "jsObj"); 第一个参数的两种写法。
一、
mWebView.addJavascriptInterface(getHtmlObject(), "jsObj");
private Object getHtmlObject(){
Object insertObj = new Object(){
//Html调用android本地Java方法。返回String类型数据给Html
@JavascriptInterface
public String HtmlcallJava(){
return "Html call Java";
}
//Html调用android本地Java方法。注意:HTML中带参数了。var str = window.jsObj.HtmlcallJava2("Hello world");
//Java方法也要带参数(否则会调不通)
@JavascriptInterface
public String HtmlcallJava2(final String param){
return "Html call Java : " + param;
}
@JavascriptInterface
public void JavacallHtml(){
runOnUiThread(new Runnable() {
@Override
public void run() {
mWebView.loadUrl("javascript: showFromHtml()");
Toast.makeText(JSAndroidActivity.this, "clickBtn", Toast.LENGTH_SHORT).show();
}
});
}
@JavascriptInterface
public void JavacallHtml2(){
runOnUiThread(new Runnable() {
@Override
public void run() {
mWebView.loadUrl("javascript: showFromHtml2('IT-homer blog')");
Toast.makeText(JSAndroidActivity.this, "clickBtn2", Toast.LENGTH_SHORT).show();
}
});
}
};
return insertObj;
}
二、
webview.addJavascriptInterface(new JSCallBack(), "js");
protected Handler mHandler = new Handler();
private final class JSCallBack {
@JavascriptInterface
public void toast(final String str) {
mHandler.post(new Runnable() {
@Override
public void run() {
showToast(str);
}
});
}
@JavascriptInterface
public void reload() {
mHandler.post(new Runnable() {
@Override
public void run() {
webview.reload();
}
});
}
@JavascriptInterface
public void showAlert(String msg){
showToast(msg);
}
@JavascriptInterface
public void pay(final String payInfo){
System.out.println("payInfo:"+payInfo);
mHandler.post(new Runnable() {
@Override
public void run() {
startAlipay(payInfo);
}
});
}
@JavascriptInterface
public void goHome(){
Intent intent = new Intent(mContext, HomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("module", "HomeFragment");
startActivity(intent);
finish();
}
}
推荐第二种,更清晰,尽量用handle处理。