android中webview加载本地html,与javascript与android方法相互传值... -尊龙游戏旗舰厅官网
最近在做项目中,要使用hightchart来实现心电图,于是,使用webview加载本地html页面,但是数据是通过蓝牙设备采集的数据,用java代码获取的数据,需要将数据传到javascript中去,使用来绘制心电图。以前都加载服务器端返回的url地址,使用webview加载,这次不同了,要自己实现心电图的绘制。于是细细的学习了javascript与java代码相互传值,最后总结在这里。
为了让webview中的javascript脚本调用android方法,webview提供了一套websettings工具类,该工具了提供了大量的方法来管理webview的选项设置,其中setjavascriptenable(true),是让webview中的javascript脚本来调用android方法。
还有一个最重要的方法addjavascriptinterface(object obj,string name)方法,该方法负责把object对象暴漏成javascript中的name对象。
1.在webview调用android只需要三步
1.1首先创建一个java类
public class myobject {private context mcontext;private string data;private string time;public myobject(context c,string data,string time){this.data = data;this.time = time;mcontext = c;}/*** 获取心电数据* @return*/@javascriptinterfacepublic string getdata(){string[] dd = new string[0];try {dd = data.substring(data.indexof("ъ") 2, data.length()-1).split(",");} catch (exception e) {e.printstacktrace();}return arrays.tostring(dd).tostring();}/*** 获取测量时间* @return*/@javascriptinterfacepublic string gettime(){return time;} }1.2创建在activity中加载html页面
websettings wset =wb .getsettings();//调用webview关联的websettings中setjavascriptenable(true)方法。wset.setjavascriptenabled(true);//加载本地html页面wb.load;if (mlist != null && mlist.size()>0) {调用webview关联的websettings中addjavascriptinterface(object obj,string name)。wb.addjavascriptinterface(new myobject(getactivity(), mlist.get(0).getresult(),mlist.get(0).getdatetime()),"myobj");//这里的myobj是javascript对象,直接调用gettime()方法,即 myobj.gettime();}1.3创建xd.hmtl文件
<html> <head><base href="<%=basepath%>"><title>心电title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="this is my page"><script type="text/javascript" src="file:///android_asset/js/jquery-1.8.3.min.js">script><script type="text/javascript" src="file:///android_asset/js/highcharts.js">script><script type="text/javascript"> $(function(){var data = myobj.getdata();var time = myobj.gettime();datahighchartxddt(data,time);})//心电function datahighchartxddt(dtxd,t){//以下是绘制心电的逻辑//省略});}script><style>style> head><body><div class="middlecenter-left-data-top" id="container">div> body> html>注意:
var data = myobj.getdata(); var time = myobj.gettime();以上第一个方法就是获取心电数据,第二个方法就是获取测量时间。
2.在android调用javascript方法
2.1webview调用js的基本格式为
webview.loadurl(“javascript:methodname(parametervalues)”)2.2调用js无参无返回值函数
string call = "javascript:sayhello()"; webview.load;2.3调用js有参无返回值函数
注意对于字符串作为参数值需要进行转义双引号。
string call = "javascript:alertmessage("" "content" "")"; webview.load;2.4调用js有参数有返回值的函数
android在4.4之前并没有提供直接调用js函数并获取值的方法,所以在此之前,常用的思路是 java调用js方法,js方法执行完毕,再次调用java代码将值返回。
2.4.1.java调用js代码
string call = "javascript:sumtojava(1,2)"; webview.load;2.4.2 js函数处理,并将结果通过调用java方法返回
function sumtojava(number1, number2){window.control.onsumresult(number1 number2) }2.4.3.java在回调方法中获取js函数返回值
@javascriptinterface public void onsumresult(int result) {log.i(logtag, "onsumresult result=" result); }2.5 java代码时用evaluatejavascript方法调用
function getgreetings() {return 1; } private void testevaluatejavascript(webview webview) {webview.evaluatejavascript("getgreetings()", new valuecallback输出结果
i/mainactivity( 1432): onreceivevalue value=1
注意
上面限定了结果返回结果为string,对于简单的类型会尝试转换成字符串返回,对于复杂的数据类型,建议以字符串形式的json返回。
evaluatejavascript方法必须在ui线程(主线程)调用,因此onreceivevalue也执行在主线程。
总结,javascript与android方法相互传值,基本上就这么多了。
总结
以上是尊龙游戏旗舰厅官网为你收集整理的android中webview加载本地html,与javascript与android方法相互传值...的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇:
- 下一篇: java 动态代理实践aop