16_android_WebView与Javascript的交互

在WebView中不仅可以运行HTML代码,更重要的是,WebView可以与Javascript互相调用。也就是说,在Javascript中可以获取WebView的内容,与此同时,在WebView中也可以调用Javascript里面的方法。

下面通过如下案例来分析WebView与javascript的交互

1.第一步在布局文件中声明WebView(activity_main.xml)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >
    <WebView
        android:id="@+id/webView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

2.在项目的assets目录下面存放html文件(user.html)

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
	function show(jsondata){
	    //通过eval函数 转化成 josn对象
		var jsonobjs = eval(jsondata);
		var table = document.getElementById("user");
		for(var y=0; y<jsonobjs.length; y++){
	        var tr = table.insertRow(table.rows.length); //添加一行
	        //添加三列
	        var td1 = tr.insertCell(0);
	        var td2 = tr.insertCell(1);
	        td2.align = "center";
	        var td3 = tr.insertCell(2);
	        //设置列内容和属性
	        td1.innerHTML = jsonobjs[y].id;
	        td2.innerHTML = "<a href='javascript:csdn.call("+jsonobjs[y].phone+")'>"+ jsonobjs[y].name + "</a>";
	        td3.innerHTML = jsonobjs[y].phone;
		}
	}
	//警告框
	function alertMsg(){
	   alert("hello alert");
	}
	//确认框
	function confirmMsg(){
	    confirm("hello confirm");
	}
	//提示框
	function promptMsg(){
	    prompt("hello prompt");
	} 

</script>
</head>
<body onload="javascript:csdn.userList()">
	<table border="0" width="100%" id="user">
		<tr>
			<td width="20%">序号</td><td align="center">姓名</td><td width="20%">电话</td>
		</tr>
	</table>

	<div>
	  <input type="button" onclick="javascript:alertMsg()" value="弹出警告框"/>
	  <input type="button" onclick="javascript:confirmMsg()" value="确认框"/>
	  <input type="button" onclick="javascript:promptMsg()" value="提示框"/>
	</div>
</body>
</html>

备注:为了让WebView从apk文件中加载 assets,Android SDK提供了一个schema,前缀为"file:///android_asset/"。WebView遇到这样的schema,就去当前包中的
assets目录中找内容

3.具体代码的实现(详解见代码注释)

public class MainActivity extends Activity {
	// 声明控件对象
	private WebView webView;
	// 声明handler对象
	private Handler handler = new Handler();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 获取控件对象
		webView = (WebView) findViewById(R.id.webView1);
		// 获取webview控件属性对象
		WebSettings webSettings = webView.getSettings();
		// 支持javascript代码
		webSettings.setJavaScriptEnabled(true);
		// 添加javascript接口对象
		webView.addJavascriptInterface(new JavascriptUser(), "csdn");

		// WebChromeClient主要用来辅助WebView处理Javascript的对话框、网站图标、网站标题以及网页加载进度等。
		webView.setWebChromeClient(new WebChromeClient() {
			//处理确认框
			@Override
			public boolean onJsConfirm(WebView view, String url,
					String message, final JsResult result) {
				// 创建builder对象
				new AlertDialog.Builder(MainActivity.this)
						.setTitle("onJsConfirm").setMessage(message)
						.setPositiveButton("确认", new OnClickListener() {
							@Override
							public void onClick(DialogInterface dialog,
									int which) {
								result.cancel();//如果不取消,按钮只能处理一次,取消后不限制
							}

						}).show();

				return true;
			}
			//处理提示框
			@Override
			public boolean onJsPrompt(WebView view, String url, String message,
					String defaultValue, final JsPromptResult result) {
				// 创建builder对象
				new AlertDialog.Builder(MainActivity.this)
						.setTitle("onJsPrompt").setMessage(message)
						.setPositiveButton("确认", new OnClickListener() {

							@Override
							public void onClick(DialogInterface dialog,
									int which) {
								result.cancel();
							}

						}).show();

				return true;
			}

			//处理警告框
			@Override
			public boolean onJsAlert(WebView view, String url, String message,
					final JsResult result) {
				/*
				 * Toast.makeText(MainActivity.this, message, 1).show();
				 *
				 * result.confirm(); //确认后,可以处理多次点击,否则按钮只能点击一次
				 */
				// 创建builder对象
				new AlertDialog.Builder(MainActivity.this)
						.setTitle("onJsAlert").setMessage(message)
						.setPositiveButton("确认", new OnClickListener() {
							@Override
							public void onClick(DialogInterface dialog,
									int which) {
								result.cancel();
							}

						}).show();

				return true;
			}

		});

		// 加载显示的网页 规定:schema file:///android_asset
		webView.loadUrl("file:///android_asset/user.html");
	}

	class JavascriptUser {
		// 打电话   备注:在android17版本之后必须通过 @JavascriptInterface 注解实现,否则会出现bug(详见异常)
		//这个方法是在网页中调用的:<a href='javascript:csdn.call("+jsonobjs[y].phone+")'>"+ jsonobjs[y].name + "</a>
		@JavascriptInterface
		public void call(final String phone) {
			//处理的操作要在hanlder中处理
			handler.post(new Runnable() {
				@Override
				public void run() {
					//这里要实现打电话的操作,必须添加打电话的权限 <uses-permission android:name="android.permission.CALL_PHONE"/>
					startActivity(new Intent(Intent.ACTION_CALL, Uri
							.parse("tel:" + phone)));
				}
			});

		}

		//加载所有的数据   备注:在android 17版本之后必须通过 @JavascriptInterface 注解实现,
		//否则会出现"Uncaught TypeError: Object [object Object] has no method 'userList'",
		//source: file:///android_asset/user.html (31)
		//这个方法是在网页中调用的onload="javascript:csdn.userList()"
		@JavascriptInterface
		public void userList() {
			handler.post(new Runnable() {
				@Override
				public void run() {
					try {
						// 创建json对象
						JSONObject jsonObject = new JSONObject();
						jsonObject.put("id", 1);
						jsonObject.put("name", "chenhj");
						jsonObject.put("phone", "110");
						// 创建json对象
						JSONObject jsonObject2 = new JSONObject();
						jsonObject2.put("id", 2);
						jsonObject2.put("name", "wangsan");
						jsonObject2.put("phone", "112");
						// 创建json数组
						JSONArray jsonArray = new JSONArray();
						jsonArray.put(jsonObject);
						jsonArray.put(jsonObject2);
						// 把json数组转换成字符串
						String jsonstr = jsonArray.toString();
						// TODO Auto-generated method stub
						// 调用网页中的javascript中的show函数
						webView.loadUrl("javascript:show('" + jsonstr + "')");

					} catch (JSONException e) {
						e.printStackTrace();
					}

				}
			});

		}
	}
}

4.运行效果图说明:

4.1当成功部署,启动后的界面如下(备注:网页中调用的onload="javascript:csdn.userList()" 与java代码中调用了webView.loadUrl("javascript:show(‘" + jsonstr + "‘)");

4.2当点击用户名比如chj时 会进入到拨号界面;说明成功调用了java中的call方法

4.3当点击弹出警告框 按钮时 会出现如下界面;说明成功调用了WebChromeClient子类中重写的onJsAlert

4.4当点击 确认框 按钮时 会出现如下界面;说明成功调用了WebChromeClient子类中重写的onJsConfirm

4.5当点击提示框 按钮 会出现如下界面;说明成功调用了WebChromeClient子类中重写的onJsPrompt

时间: 2024-10-14 01:11:29

16_android_WebView与Javascript的交互的相关文章

本地java代码和javascript进行交互(java和js互调)

在android的开发过程中,有很多时候需要用到本地java代码和javascript进行交互.android对交互进行了很好的封装,在开发中我们可以很简单的用java代码调用webview中的js,也可以用webview中的js来调用本地的java代码,这样我们可以实现很多原来做不了的功能,比如点击网页上的电话号码后,手机自动拨打电话,点击网页中的笑话,自动发送短信等. 废话不多说,这次教程的目标如下 android 中的java代码调用webview里面的js脚本 webview中的js脚本

【ActionScript】Flash与网页的交互,ActionScript与JavaScript的交互

Flash是可以轻松与网页交互数据的,不然为何Flash会有这么大的生命力呢?仅仅是这样编程比較麻烦而已,又要调试Flash,然后又要放到server上调试. 只是这种方式可以收到非常好的效果.Flash强大的画图功能.图形功能,可以与网页的參数传递联系起来,配合后端的server语言,可以收到非常大效果. 以下举个样例用ActionScript3.0来说明这个问题,例如以下图: IE6效果: 火狐效果: 一旦浏览器装上Flash插件,Flash就行轻松与网页互通消息. 不管在不论什么浏览器,如

PHP学习笔记-PHP与JavaScript的交互

转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/51814192 本文出自:[顾林海的博客] 前言 前两篇笔记PHP学习笔记-PHP与Web页面的交互1和PHP学习笔记-PHP与Web页面的交互2讲了PHP与Web的交互,JavaScript在Web系统中得到了非常广泛的应用,因此接下来记录的是PHP与JavaScript的交互. 认识JavaScript JavaScript是由Netscape Communicat

高德地图组件在Android的应用以及Android与JavaScript的交互

最近在慕课网学习了关于高德地图组件的课程(其实就是一个广告,内容和官网的API完全一样),发现这个JavaScript API比Android API简单方便多了,于是就打算放在Android APP上来实现,花了一点小功夫,但是最终还是实现了,后来打算扩展的时候遇到个问题:就是高德官网有一个坐标拾取点(高德的坐标和我们平时取的坐标不一样,可以将高德坐标理解为中国的国标,直接获取的坐标是国际标准的坐标),后来发现有html文件直接实现了这个功能,于是就把这个html扒出来了,但是重点问题来了:如

C# windows程序应用与JavaScript 程序交互实现例子

C# windows程序应用与JavaScript 程序交互实现例子 一.建立网页代码(包含js方法代码和访问外部windows应用事件) 这里需要注意js访问外部windows应用程序方法,需要代用windows对象的external 例子:window.external.CSharpfunction(xx,xx,xx); 1 <!DOCTYPE html> 2 3 <html lang="en" xmlns="http://www.w3.org/1999

Delphi与Javascript的交互

网络上也有人写了关于Delphi与Javascript的文章,其大多数使用ScriptControl等,均无法达到与Delphi自身融合的效果.我也是在翻阅自己的组件库的时候发现了这个以前收集来的代码.这个主要是使用了Mozilla的Javascript引擎,所以在程序运行的时候必须带上js3215R.dll和msvcr70.dll这两个动态链接库. 现在我们来看一看几个例子: 例程1: 说明:该例程主要是把Javascript代码以字符串的形式内置在Delphi程序代码内,然后与Delphi交

UIWebView与JavaScript的交互

UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌入页面中,通过这个方法我们可以在iOS中与UIWebView中的网页元素交互. stringByEvaluatingJavaScriptFromString 使用stringByEvaluatingJavaScriptFromString方法,需要等UIWebView中的页面加载完成之后去调用.我们在 界面上拖放一个UIWebView控

iOS UIWebView与JS(JavaScript)交互-----根据节点隐藏HTML中内容

在移动端(这里指iOS)开发中,我们免不了使用UIWebView与JS交互. 先简单了解一下JS,JavaScript是一种直译式的脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.广泛用于客户端,主要用来向HTML页面添加交互行为.它可以直接嵌入HTML页面,但写成单独的JS文件有利于结构和行为的分离.JS具有跨平台特性,在绝大多数浏览器的支持下,可以在多种平台下运行(如Windows.Linux.Mac.Andriod.iOS等).作为直译语言,它的弱点:安全性. -- 摘自

OC与JavaScript的交互

stringByEvaluatingJavaScriptFromString的用法,它的功能非常的强大,用起来非常简单,通过它我们可以很方便的操作uiwebview中的页面元素. UIWebView是iOS最常用的8SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌入页面中,通过这个方法我们可以在iOS中与UIWebView中的网页元素交互. stringByEvaluatingJavaScriptFromString