Webview中android与Javascript(js)交互

来源:互联网 发布:中国网络资讯台李学科 编辑:程序博客网 时间:2024/06/02 05:37

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@JavascriptInterfacepublic String HtmlcallJava(){return "Html call Java";}//Html调用android本地Java方法。注意:HTML中带参数了。var str = window.jsObj.HtmlcallJava2("Hello world");//Java方法也要带参数(否则会调不通)@JavascriptInterfacepublic String HtmlcallJava2(final String param){return "Html call Java : " + param;}@JavascriptInterfacepublic void JavacallHtml(){runOnUiThread(new Runnable() {@Overridepublic void run() {mWebView.loadUrl("javascript: showFromHtml()");Toast.makeText(JSAndroidActivity.this, "clickBtn", Toast.LENGTH_SHORT).show();}});}@JavascriptInterfacepublic void JavacallHtml2(){runOnUiThread(new Runnable() {@Overridepublic 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 {@JavascriptInterfacepublic void toast(final String str) {mHandler.post(new Runnable() {@Overridepublic void run() {showToast(str);}});}@JavascriptInterfacepublic void reload() {mHandler.post(new Runnable() {@Overridepublic void run() {webview.reload();}});}@JavascriptInterfacepublic void showAlert(String msg){showToast(msg);}@JavascriptInterfacepublic void pay(final String payInfo){System.out.println("payInfo:"+payInfo);mHandler.post(new Runnable() {@Overridepublic void run() {startAlipay(payInfo);}});}@JavascriptInterfacepublic 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处理。



源码










0 0