最近项目中webview 和 html5做的交互比较多,由于不是很熟悉,难免会出现了一些bug。现在针对自己解决的这些bug,做个整理。方便日后学习和借鉴。

一. webview中的onReceivedTitle。

1.背景:我的项目是通过webview 加载url, 然后在url 中点击item项的时候,继续加载url。不同url 带有不同的标题,我们希望在点击item的时候,url标题能正确的显示在控件上(不会出现A url 把B url 的标题拿过来了,即出现标题错位现象)。结果发现,在谷歌手机Nexus上,依次点击进入的时候,标题没有错位。但是当点击返回的时候,总是拿的是上个html5标题。在华为手机上测试,结果正常。

2.分析:先上原来的效果图:

操作步骤:科室主页==》入院须知。
科室主页==》健康资讯==》资讯详情。
在代码中设置标题为:

mWebView.setWebChromeClient(new WebChromeClient() {@Overridepublic void onReceivedTitle(WebView view, String title) {super.onReceivedTitle(view, title);tv_topTitle.setText(title);}

进入的时候,标题是正常的,没有错位。但是点击返回按钮的时候,结果发现标题错位了,返回的时候总是会拿取上一个html5的标题。
刚开始还以为是缓存的原因,加了一行代码:

mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

还是不起作用,调试的时候发现谷歌和华为的差异如下:(分别在onReceivedTitle和goBack处打印webview中的标题)

华为手机打印日志:

谷歌手机打印日志:

对比发现:华为手机在返回的时候,会再次调用onReceivedTitle方法。而谷歌手机,返回之后,不会调用了。导致页面标题还是停在上一个html5的页面。

3.解决方案:
自定义个一个WebInfo类,将url和title作为成员变量:

  class WebInfo implements Serializable {private String url;private String title;public WebInfo(String url, String title) {this.url = url;this.title = title;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}}

onReceivedTitle中处理方案为:

 mWebView.setWebChromeClient(new WebChromeClient() {@Overridepublic void onReceivedTitle(WebView view, String title) {super.onReceivedTitle(view, title);Log.e("html5",view.getTitle());tv_topTitle.setText(title);//把标题信息存入webList,在页面返回时使用if (!webList.isEmpty()) {//比较最后一项的url是否与当前页面一样,不一样则添加,一样则不添加if (!webList.get(webList.size() - 1).url.equals(mWebView.getUrl())) {WebInfo info = new WebInfo(mWebView.getUrl(), title);webList.add(info);}} else {WebInfo info = new WebInfo(mWebView.getUrl(), title);webList.add(info);}}

在返回的时候,处理如下:

  @Overridepublic void onBack(View v) {if (mWebView.canGoBack()&& webList.size() > 1) {mWebView.goBack();webList.remove(webList.size() - 1);tv_topTitle.setText(webList.get(webList.size() - 1).getTitle());Log.e("html5返回",mWebView.getTitle());}else{finish();}}

经验证,此方案可以解决html5 返回标题错乱的问题,并且在华为手机和谷歌手机上都正常了。

二. webview 和js交互

这里写出的是我最常用的一个交互,比如说:如下,需要取出emptyTip的值。根据这个值是否为空,做相应的UI操作:

<body style="overflow-y:hidden;position:absolute;left:0em;right:0em;top:0em;bottom:0em;margin:0em"><p class="emptyTip">立即创建公告吧</p><div id="wrapper" style="position:absolute;width:100%;height:100%;overflow:hidden"></div>
<script>
$(function(){});
</script>
</body>

先设置webview支持JavaScript:

mWebView.getSettings().setJavaScriptEnabled(true);

执行js代码:

 @Overridepublic void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);hideLoadingDialog();     wv_content_notice.loadUrl("javascript:window.ys_control.getNoticeID(document.getElementsByClassName('emptyTip')[0].innerHTML);");}

自定义js接口:

private void dealwithUrl(String originalUrl) {wv_content_notice.addJavascriptInterface(new JsInteration(), "ys_control");}public class JsInteration {@JavascriptInterfacepublic void getNoticeID(String  result) {//不管结果如何,都发送消息出去,在handler中统一处理Message message = new Message();message.obj = result;message.what = IResult.DEAL_TITLE;handler.sendMessage(message);}}

处理消息:获取到emptyTip的内容,根据内容自行处理。

 case IResult.DEAL_TITLE:String content = (String) msg.obj;if(null!=content){Log.e("测试",content);tv_right_fun_2.setVisibility(View.INVISIBLE);tv_right_fun_3.setText("新建");tv_right_fun_3.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent3 = new Intent(CdAnnounceActivity.this, CdNewAnnounceActivity.class);intent3.putExtra("CDROOMID", cloudroomid);startActivity(intent3);}});}break;

以上2点就是在运用webview和html5交互的时候,积累的一点小小经验。我觉得最大的收获就是:当对整体都不熟悉的时候,不妨在方法中多打印下一些重要参数,比如url等,通过观察发现url 或许可以得到启发。

WebView和html5 的交互相关推荐

  1. Android开发之Webview中原生与JS交互

    文章目录 概述 使用场景 交互方式 Java调用JS代码 JS调用Java代码 总结 概述 由于手机硬件资源的快速提升,使得采用混合开发的可能性逐渐成为现实并且流行起来.Android开发中最为简单的 ...

  2. html5的交互标签,html5里交互元素的使用方法

    在H5里,交互元素就是和用户进行互动的元素,这一部分非常的重要,并且和之前的JS控制的效果不同,H5相比于HTML增加了很多的交互元素,比如隐藏显示注脚就是其中的一个交互效果. 交互元素的使用 bod ...

  3. android webview调js方法,Android中WebView与H5的交互,Native与JS方法互调

    项目中经常用到WebView与H5的交互,一个是H5调本地方法,一个是本地调H5方法,在此记录一下. 首先,启用JS支持 //启用js支持 webSettings.setJavaScriptEnabl ...

  4. android js交互 数组,Android WebView —— Java 与 JavaScript 交互总结

    相比于 Native App 和 Web App,Hybrid App 凭借其迭代灵活.控制自如.多端同步的优势在应用市场上越发显得优胜,主要得力于,其将变更频繁的部分产品功能使用 H5 开发并在客户 ...

  5. android webview video标签,Android WebView支持html5 video标签

    看到这个标题很兴奋了吧,但是内容肯定会让你失望...这先告诉结果了,我没在2.3上搞出什么名堂来. 起因是项目需要在android 2.3.*的版本上调用有video标签的页面,调研是否支持.百度,g ...

  6. 微信小程序web-view与H5之间交互(含支付)

    第一章 了解web-view与H5的交互(含支付) 文章目录 第一章 了解web-view与H5的交互(含支付) 前言 一.web-view是什么? 二.使用步骤 三.业务场景 1.小程序带参数跳转链 ...

  7. android Echart力图webview,包含双向交互内容

    android Echart力图webview,包含双向交互内容 H5界面代码 <!DOCTYPE html> <html> <head><title> ...

  8. WebView使用以及JS交互以及浏览器编写与高德导航

    WebView使用以及JS交互以及浏览器编写与高德导航 WebView使用以及JS交互以及浏览器编写 高德导航(步行,骑行,驾车,货车) WebView使用以及JS交互以及浏览器编写 浏览器编写 &l ...

  9. html5 android 拍照上传,android webview使用html5 上传相册、拍照照片

    本人编程新手,这次做的功能是android webview 嵌入HTML5的页面,页面中有一个标签,iOS直接就支持,但android中不支持,网上的帖子说是因为android屏蔽了文件上传功能还是怎 ...

最新文章

  1. python中类和对象的内容_python中的类和对象
  2. 获取rabbitmq连接对象_RabbitMQ——简单队列
  3. Vue 中的 v-cloak 作用及用法-vue页面加载时会闪烁
  4. 文件锁操作《精通Unix下C语言编程与项目实践》之三
  5. 13个开发者技能必知必会!
  6. hdu1018--Big Number
  7. java虚拟机采用UTF-16编码格式对字符进行编码
  8. sql 查询结果为null替换 为 0
  9. Linux进程全解8——exec 族函数
  10. 信息量、熵、交叉熵、KL散度、JS散度杂谈
  11. 任意两点间的最短路径
  12. xmodmap使用指南
  13. python和pytorch关系_pytorch 模拟关系拟合——回归实例
  14. SQL Server 查询数据库中被锁定的表
  15. 在微信公众平台做HTML5游戏经验谈
  16. winform chart控件 滚动条
  17. 服务器引导损坏怎么处理,硬盘主引导记录(MBR)损坏,一个命令轻松解决问题...
  18. 鸿蒙系统翻车了,鸿蒙系统翻车了?任正非承认忽视了关键问题,称华为犯下大错误...
  19. java大量数据导出到Excel
  20. 什么是实人认证?需要用到哪些api接口

热门文章

  1. 链路层-滑动窗口协议-回退N帧协议-窗口大小选择问题
  2. Windows制作启动U盘太麻烦,用CMD快速解决
  3. 使用ffmpeg转换webm格式
  4. 天地不仁,以万物为刍狗--[1971年萨姆派金帕暴力电影代表作][稻草狗/大丈夫]...
  5. MISRA C 2004中文版
  6. 基于docker的高可用openldap(包含lam-admin网页和sudo,ppolicy模块)
  7. geckodriver、selenium、firefox版本对应关系
  8. 股票、证券等(个人)商业投资(融资)
  9. halcon直线延长
  10. win10使用easybcd误删引导进不去系统解决办法