版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/51759125

最近在做项目中,要使用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. 调用WebView关联的WebSettings中setJavaScriptEnable(true)方法。
  2. 调用WebView关联的WebSettings中addJavaScriptInterface(Object obj,String name)。
  3. 在JavaScript中通过暴露出来的name调用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.loadUrl("file:///android_asset/xd.html");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文件

<!DOCTYPE HTML>
<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"><!--<link rel="stylesheet" type="text/css" href="styles.css">--><!--<script src="http://cdn.hcharts.cn/jquery/jquery-1.8.3.min.js"></script>--><!--<script src="http://cdn.hcharts.cn/highcharts/highcharts.js"></script>--><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.loadUrl(call);

2.3调用js有参无返回值函数

注意对于字符串作为参数值需要进行转义双引号。

String call = "javascript:alertMessage("" + "content" + "")";
webView.loadUrl(call);

2.4调用js有参数有返回值的函数

Android在4.4之前并没有提供直接调用js函数并获取值的方法,所以在此之前,常用的思路是 java调用js方法,js方法执行完毕,再次调用java代码将值返回。

2.4.1.Java调用js代码

String call = "javascript:sumToJava(1,2)";
webView.loadUrl(call);

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<String>() {@Overridepublic void onReceiveValue(String value) {Log.i(LOGTAG, "onReceiveValue value=" + value);}});
}

输出结果

I/MainActivity( 1432): onReceiveValue value=1
注意

上面限定了结果返回结果为String,对于简单的类型会尝试转换成字符串返回,对于复杂的数据类型,建议以字符串形式的json返回。
evaluateJavascript方法必须在UI线程(主线程)调用,因此onReceiveValue也执行在主线程。

总结,JavaScript与Android方法相互传值,基本上就这么多了。

Android中WebView加载本地Html,与JavaScript与Android方法相互传值...相关推荐

  1. Android中WebView加载本地Html,与JavaScript与Android方法相互传值(续)...

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010046908/article/details/51809558 接着上篇Android中Web ...

  2. Android中WebView加载sdcard中的html时提示:ERR_FILE_NOT_FOUND和ERR_ACCESS_DENIED

    场景 Android中WebView加载sdcard中的html显示: Android中WebView加载sdcard中的html显示_BADAO_LIUMANG_QIZHI的博客-CSDN博客 在实 ...

  3. Android中WebView加载sdcard中的html显示

    场景 Android中使用WebView加载本地html并支持运行JS代码和支持缩放: Android中使用WebView加载本地html并支持运行JS代码和支持缩放_BADAO_LIUMANG_QI ...

  4. android webview内容变大,Android中WebView加载的网页被放大的解决办法

    在某些大分辨率下,我们用WebView加载的网页可能会出现被放大的现象,这显然不是我们想要的结果,我开始看WebSettings这个是否可以设置不缩放,webSettings.setBuiltInZo ...

  5. Android的webview加载本地html、assert内html和收集URL

    1 //打开本包内asset目次下的test.html文件 2 wView.loadUrl(" file:///android_asset/test.html "); 3 //打开 ...

  6. Android的webview加载本地html、本apk内html和远程URL

    -----打开本包内asset目录下的index.html文件 //wView.loadUrl(" file:///android_asset/index.html "); --- ...

  7. android webview白屏,Android中WebView加载页面出现白屏解决方案

    首先在WebViewClient中添加 @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, ...

  8. android webview加载不出来,【新手有关问题】Android浏览器中WebView加载不出网页

    当前位置:我的异常网» Android » [新手有关问题]Android浏览器中WebView加载不出网 [新手有关问题]Android浏览器中WebView加载不出网页 www.myexcepti ...

  9. iOS WebView 加载本地资源(图片,文件等)

    NSString *path = [[NSBundle mainBundle] pathForResource:@"关于.docx" ofType:nil]; NSURL *url ...

最新文章

  1. tomcat启动后 项目运行缓慢,要几十到几百秒不等 怎么样./startup.sh 运行加快
  2. 一个用于styleGAN图像处理的编码器
  3. 1-6 数据查询(下)——复杂查询
  4. docker lamp php7,如何用docker安装lamp
  5. IDEA报错Web server failed to start. Port 8080 was already in use的解决方法
  6. python爬取地理数据_python爬取所有人位置信息——腾讯位置大数据
  7. 论文笔记 《Selective Search for Object Recognition》
  8. ubuntu下安装phpredis的模块扩展
  9. vue中v-on指令的使用之Vue知识点归纳(四)
  10. kotlin之高阶函数
  11. 如果unity双击无法打开怎么办
  12. 吴军,阅读与写作,11,写景:如何寓情于景?
  13. 写给立志进入网络行业的朋友的一些忠告
  14. 日系插画学习笔记(四):基础人体结构
  15. NIO及多线程实现聊天室完整版
  16. python绘制图形界面(一)
  17. 创意小发明:使用51系列单片机的DIY点焊机控制项目(程序+原理图)
  18. 基于JAVA校内图书馆智能管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
  19. 逃离云端“母体”——虚拟机逃逸
  20. tensorflow--猫狗识别

热门文章

  1. SpringMVC(二)——转发和重定向、处理前端请求的数据(普通字符串/对象)
  2. SCI论文写作--IEEE的期刊和杂志区分
  3. Win32串口操作的技巧
  4. 数组越界怎么判断_算法连载之求解两个有序数组的中位数
  5. pypthon3精要(11)-try,except,else异常处理
  6. 写了本机器学习入门书
  7. Python业务分析实战|共享单车数据挖掘
  8. 【机器学习】PyCaret!又一个神仙的自动机器学习库!
  9. 【论文解读】CVPR 2021 | 旷视提出GID:用于目标检测的通用实例蒸馏
  10. 【论文解读】ICLR2020 | 深度自适应Transformer