Webview中android与Javascript(js)交互

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处理。



源码










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值