android webview 监听js,Android webview与js的数据交互

项目要用到Webview和js交互,查了查以前的项目感觉还是有必要整理下的。

简单描述下项目中用到的地方,比如说在web页需要用到登录的地方点击登录跳转到APP原生登录界面去登录,点击web页的拨打电话弹出原生dialog询问是否拨打,点击web页里面的图片进行放大处理。针对于上述的需求我们通用的方式大概有两种,一是监听a标签,在shouldOverrideUrlLoading根据URL进行判断,二是js代码注入,找到我们想要处理的元素进行js代码注入。下面就这两种方式简单的进行描述

首先需要初始化WebView以及设置支持JavaScript,常用的配置属性有一下几种,可以在项目中根据需求添加

WebSettings webSetting = webView.getSettings();

// 支持JavaScript

webSetting.setJavaScriptEnabled(true);

// 设置可以访问文件s

webSetting.setAllowFileAccess(true);

// 告诉javascript来自动打开的窗口。这适用于JavaScript函数的窗口,open()。

webSetting.setJavaScriptCanOpenWindowsAutomatically(true);

// 支持缩放

webSetting.setSupportZoom(true);

// 是否禁止是网络加载数据

webSetting.setBlockNetworkLoads(false);

// 设置是否支持多窗口

webSetting.setSupportMultipleWindows(true);

// 是否开启本地DOM存储

webSetting.setDomStorageEnabled(true);

// 设置不缓存

webSetting.setCacheMode(WebSettings.LOAD_NO_CACHE);

// 阻塞加载图片

webSetting.setBlockNetworkImage(false);

// 支持启用插件

webSetting.setPluginState(WebSettings.PluginState.ON);

// 设置任意比较缩放为真

webSetting.setUseWideViewPort(true);

// 设置WebView加载页面的模式

webSetting.setLoadWithOverviewMode(true);

// 控制页面显示布局

// NARROW_COLUMNS:可能的话使所有列的宽度不超过屏幕宽度

// NORMAL:正常显示不做任何渲染

// SINGLE_COLUMN:把所有内容放大webview等宽的一列中

webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);

//禁止用地理定位

webSetting.setSaveFormData(true);

// 是否启动地理定位

webSetting.setGeolocationEnabled(true);

// 设置定位的数据库路径

webSetting.setGeolocationDatabasePath("/data/data/org.itri.html5webview/databases/");

接下来就是WebView交互中非常重要的两个类WebViewClient和WebChromeClient。WebViewClient就是帮助WebView处理各种通知、请求事件的,具体来说包括以下常用方法:

onLoadResource() // 在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。

shouldOverrideUrlLoading //在点击请求的是链接是才会调用,重写此方法返回true表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边。这个函数我们可以做很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。

onPageStart //这个事件就是开始载入页面调用的,通常我们可以在这设定一个loading的页面,告诉用户程序在等待网络响应。

onPageFinish //在页面加载结束时调用。同样道理,我们知道一个页面载入完成,于是我们可以关闭loading 条,切换程序动作。

onReceiveError // (报告错误信息)

onReceivedHttpAuthRequest ()//(获取返回信息授权请求)

WebChromeClient是辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等 ,常用方法有以下几个:

onCloseWindow() //关闭WebView

onCreateWindow()

onJsAlert //WebView上alert是弹不出来东西的,需要定制你的WebChromeClient处理弹出)

onJsPrompt

onJsConfirm

onProgressChanged //可以根据加载进度设置进度条

onReceivedIcon //可以获取URL icon

onReceivedTitle //可以获取URL title

一、监听a标签

这种实现方式比较简单,我们可以在shouldOverrideUrlLoading中根据URL进行判断,比如说界面中有一个拨打电话的功能,其js代码如下

e950c31b53af13e73227b7b729ccccad.png

这里我们可以通过如下方式进行弹出原生dialog

public boolean shouldOverrideUrlLoading(WebView view, String url) {

if (TextUtils.isEmpty(url))

return true;

if (url.startsWith("tel:")) {

PhoneDialog callDialog = new PhoneDialog(WebViewActivity.this, url);

callDialog.disDialog();

callDialog.callPhone();

callDialog.show();

return true;

}

return true;

}

二、通过js代码

查了下常用的注入方式有两种,第一种是当webview加载完之后,读取整个js文件中的内容,然后将整个文件内容以字符串的形式,通过webview.loadUrl(“javascript:fileContentString”)注入,不过我好像没怎么用到过这个方式,一般都是用第二种,即通过给特定标签设置事件来满足业务需求。

比如说我们给所有的图片设置一个点击事件来获取图片,进行一些列放大存储等操作,我们可以通过如下代码来实现。

// 注入js函数监听

private void addImageClickListner() {

// 这段js函数的功能就是,遍历所有的img几点,并添加onclick函数,函数的功能是在图片点击的时候调用本地java接口并传递url过去

webView.loadUrl("javascript:(function(){" +

"var objs = document.getElementsByTagName(\"img\"); " +

"for(var i=0;i

"{"

+ " objs[i].οnclick=function() " +

" { "

+ " window.imagelistner.openImage(this.src); " +

" } " +

"}" +

"})()");

}

// js通信接口

public class JavascriptInterface {

private Context context;

public JavascriptInterface(Context context) {

this.context = context;

}

@android.webkit.JavascriptInterface

public void openImage(String img) {

Toast.makeText(context,img,Toast.LENGTH_SHORT).show();

}

}

//上述两个方法实现了给图片添加点击事件,我们还需要对webview进行设置以及注入

@SuppressLint({"JavascriptInterface", "NewApi"})

@Override

public void onPageFinished(WebView view, String url) {

view.getSettings().setJavaScriptEnabled(true);

super.onPageFinished(view, url);

addImageClickListner();// 页面加载完成之后,添加监听图片的点击js函数

}

//对WebView进行设置

webView.addJavascriptInterface(new JavascriptInterface(this), "imagelistner");

上述实现方式有以下几点需要注意:1、注意这里的方法名imagelistener要和输入的js代码里面的方法一致,2、自定义的方法openImage一定要注明@Android.webkit.JavascriptInterface,否则不起作用。

可以看到我们注入的js代码是通过getElementsByTagName获取所有的img元素然后设置点击事件,如果我们相对某一特定的元素进行设置也可以通过getElementById获取单独的元素,或者还可以通过getElementsByTagName根据TAG获取元素。

这是我现阶段知道的方式,如果还有其它比较好的实现方式可以一起讨论下。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/542373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android web通讯录,Android手机开发之通讯录

Android手机开发——通讯录实现增加、查询、修改、删除的功能,输入联系人信息,点击“添加”按钮,可以添加联系人信息到数据库;点击“查询”按钮,会发现添加的联系人信息显示在界面中;重新输入联系人电话&am…

有关UITableView--cell复用问题

近来用Tableview做了一个九宫格。过程中碰到了两个cell复用问题。 问题一: 在cell中为button添加addTarget点击事件时,出现后面的cell会重叠它前面cell的事件。代码如下: C代码 static NSString *CellWithIdentifier "DiscoverHomeTab…

JavaScript基础之Number对象和Math对象

2019独角兽企业重金招聘Python工程师标准>>> //Math对象//属性float Math.E; //返回自然对数的底数e,约2.718float Math.LN2; //返回2的自然对数,约0.693float Math.LN10; //返回10的自然对数,约2.302fl…

My linux

为什么80%的码农都做不了架构师?>>> 1.linux 命令方式修改机器名称 # hostname newHostName # vi /etc/sysconfig/network 修改或增加配置:hostnamenewHostName # vi /etc/hosts 修改对应的本地HOST映射 xx.xxx.xxx.xxx newHostName 2.Redha…

狂神说es笔记_人教版七上英语Unit5电子课本音频+课堂笔记+课后同步习题

1人教 七上英语Unit5单词七年级英语上册Unit 5单词默写1做;干(助动词)__________2做,干(助动词第三人称单数形式)__________3有__________4网球__________5球__________6乒乓球______7球棒;球拍__________8(英式)足球____________________9排…

先进技术android,React Native实战(JavaScript开发iOS和Android应用)/计算机科学先进技术译丛...

导语内容提要本书作者Nader Dabit是AWS Mobile开发人员、React Native Training创始人和React Native Radio播客主持人。本书旨在帮助iOS、Android和Web开发人员学习使用React Native框架,构建高质量的iOS和Android应用程序。书中介绍了React Native入门基础知识&am…

开发类似vs的黑色风格_传闻:2020年《使命召唤》将是《黑色行动》重启作品

据可信度较高的消息源透露,2020 年的《使命召唤》将是《黑色行动》的重启作。而据之前的报道,《黑色行动》开发商 Treyarch 正在开发今年的《使命召唤》, Sledgehammer Games 和 Raven Software 负责辅助工作。该项目代号为“宙斯”&#xff…

微信小程序 开发 微信开发者工具 快捷键

微信小程序已经跑起来了.快捷键设置找了好久没找到,完全凭感觉.图贴出来.大家看看. 我现在用的是0.10.101100的版本,后续版本更新快捷键也应该不会有什么变化. 现在貌似不能修改.如果有同学找到修改的方法,麻烦告诉我.谢谢. 微信小程序代码编辑快捷键 常用快捷键 格式调整 Ctrl…

android9有深色模式吗,深色模式还是黑色模式?微信把所有人都搞懵了

原标题:深色模式还是黑色模式?微信把所有人都搞懵了前一阵子,微信正式加入了对“深色模式”的支持,这也是除了Windows Phone 版本以外微信第一次从系统层面支持深色模式。虽然这次更新离WWDC上的演示已经过去了9个月,但…

html页面foot,HTML tfoot用法及代码示例

HTML中的标记用于提供页脚内容组。此标记在带有标题和正文的HTML表中使用,称为“thead”和“tbody”。 标记是表的子标记,是和的父标记。用法: // Table footer contents... 属性:标记包含HTML4.1支持但HTML5不支持的许多属性。align:设置文本…

迭代器 java_Java设计模式8:迭代器模式

迭代器模式迭代器模式又叫做游标(Cursor)模式,其作用是提供一种方法访问一个容器元素中的各个对象,而又不暴露该对象的内部细节。迭代器模式结构迭代器模式由以下角色组成:1、迭代器角色负责定义访问和遍历元素的接口2、具体迭代器角色实现迭…

网易 html5,别再想不开做H5了

写这篇文章的时候网易哒哒《饲养手册》H5刷屏了,但我们依旧不建议品牌做H5。H5作为大众传播工具的时代,已经过去了。尽管去年有很多H5曾经刷屏过,但在当时我们就一直跟朋友说,不要再尝试H5了,性价比根本算不过来&#…

flex 修改生成html,CSS Flex –动画教程

如果一张图片胜过千言万语 —— 那么动画呢? Flex 无法通过文字或静态图像有效地完全解释。为了巩固你对flex的了解,我制作了这些动画演示。注意 overflow: hidden 行为类型是默认值,因为 flex-wrap 还未设置。为了获得更好的想法&#xff0c…

陕西2021高考成绩在哪查询,2021陕西高考成绩查询入口

2021陕西高考成绩查询入口2021-05-13 19:38:37文/张敏有很多同学在关注2021年陕西高考成绩的查询方式,为了方便考生们查询成绩,小编整理了陕西高考成绩查询入口,希望对同学们有帮助。2021陕西高考成绩查询通道高考成绩查询过后应该做什么1、了…

查找文件中每行第二个单词_日语单词中的长短音区别在哪里,日语长短音发音有什么规律...

日语单词记忆长短音规律一、如果单词的汉字在中文汉语拼音中是前鼻音,在日语读音中就会带拨音「ん」; 如果单词的汉字在中文汉语拼音中是后鼻音,在日语读音中就会带有长音。例:専门(zhuan men)-…

SQL Server 执行计划利用统计信息对数据行的预估原理二(为什么复合索引列顺序会影响到执行计划对数据行的预估)...

本文出处:http://www.cnblogs.com/wy123/p/6008477.html 关于统计信息对数据行数做预估,之前写过对非相关列(单独或者单独的索引列)进行预估时候的算法,参考这里。  今天来写一下统计信息对于复合索引在预估时候的计…

哈密顿路径_检查图形是否为哈密顿量(哈密顿路径)

哈密顿路径Problem Statement: 问题陈述: Given a graph G. you have to find out that that graph is Hamiltonian or not. 给定图G。 您必须找出该图是否为哈密顿量 。 Example: 例: Input: 输入: Output: 1 输出1 Because here is a …

京东自动下单软件_黄牛软件自动下单秒杀商品 警方用科技手段打击

法制日报全媒体记者 张维定了10个闹钟,也抢不到一瓶茅台;等了很久的iPhone新手机,打开网页就秒没……或许并不是因为你的手速、网速慢,而是黄牛党在用软件和你抢商品。近日,在“净网2019”专项行动中,阿里安全协助江苏省南通市公安局成功打掉了一个制作销售黄牛软件…

河南招教考试计算机专业知识,河南教师招聘考试《计算机网络技术基础》知识点归纳七...

河南教师招聘考试《计算机网络技术基础》知识点归纳七1.ADSL是非对称数字用户线路,其下行速率为1.5~8 Mb/s,而上行速率则为16~640 kb/s。在一对铜双绞线上的传送距离可达5km左右,可同时上网打电话,互不影响…

content属性的4种用途

content属性浏览器支持情况&#xff0c;兼容到IE8浏览器&#xff0c;IE7及以下不支持用途一、配合:before及:after伪元素插入文本<div><p>伪元素</p> </div>p:before{content:CSS3;color:#4bb;font-weight:bold;margin-right:20px;background:#f0f0f0;…