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代码如下
这里我们可以通过如下方式进行弹出原生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获取元素。
这是我现阶段知道的方式,如果还有其它比较好的实现方式可以一起讨论下。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
android webview 监听js,Android webview与js的数据交互相关推荐
- Android 无法监听安装,Android关于apk安装成功广播监听
有这样的应用场景,apk安装成功后需要重启APP,就需要监听完成安装的回调或者广播 public class UpdateReceiver extends BroadcastReceiver { pr ...
- android 窗口监听按键,Android编程实现Dialog窗体监听的方法
本文实例讲述了Android编程实现Dialog窗体监听的方法.分享给大家供大家参考,具体如下: 今天做了一个Dialong窗体监听包括窗体内的xml监听. 效果图: test.class代码 pac ...
- android 耳机监听权限,android 耳机监听
1.判断耳机是否插入: AudioManager的isWiredHeadsetOn()方法: AudioManager localAudioManager = (AudioManager) getSy ...
- android全局监听onkeydown,Android中的几个onTouch()事件、onKeyDown监听返回键无效
Android中的几个onTouch()事件.onKeyDown监听返回键无效 一:Android中的几个onTouch()事件 继承SimpleOnGestureListener,HahaGestu ...
- android radiobutton 监听事件,Android View系列---RadioGroup与RadioButton
RadioGroup与RadioButton配合实现一组数据的单选问题. 插播一条信息,在设置RadioButton的textColor的选中效果时,不能在drawable中创建想xml,得在res/ ...
- android无法监听焦点,android tv常见问题(二)如何监听ViewGroup子View的焦点状态
如需转载请评论或简信,并注明出处,未经允许不得转载 系列文章 github地址 目录 期望结果 只要ViewGroup的内部或自身存在焦点,ViewGroup就始终保持聚焦样式. 2.1.gif 实际 ...
- android 读卡器监听,在Android中开发智能卡读卡器
我们开发了一个带有微控制器的原型板,它可以与SmartCard通信(它可以读取ATR,发出和读取对APDU命令的响应等).现在我想将这个硬件与Android手机或平板电脑一起使用.我们的电路板具有US ...
- android如何监听按钮,Android – 两个onClick监听器和一个按钮
我有一个可点击的自定义TextView.它定义了自己的onClick处理程序,以便根据点击次数更改其外观.但是,如果我在我的活动中定义第二个onClick处理程序,以便根据被单击的按钮执行某些操作,则 ...
- android如何实现QQ信息通知,android NotificationListenerService监听通知栏(qq 微信 短信)...
[实例简介] android NotificationListenerService 监听通知栏,android NotificationListenerService 监听通知栏 android N ...
最新文章
- apidoc学习(接口文档定义取代word)
- css中position初解
- 【HTML】简单实现网页加载动画
- Adopt Open JDK官方文档(四)基于虚拟机的编译环境
- Facebook要造芯片了,开发团队正在组建中
- 大数据技术对互联网的影响
- iPhone之UITextField缩进文本
- 使用VirtualHostX时如何编辑虚拟机内的文件?
- 没有资本怎么创业的思维:不是钱,是实现。
- 区块链 tps 日志统计脚本
- 高效能人士的七个习惯(一)由内而外全面造就自己
- 小程序中text标签之坑
- 二叉搜索树,就这,就这啊。
- QT从入门到入土系列教程(一)——Qt5.14.2安装教程和VS2019环境配置
- WAS6.1JNDI数据源配置测试代码
- 我是歌手黄绮珊(黄妈)彭佳慧,
- java中12 5.0f等于多少_F_____
- OSChina 周三乱弹 ——我们职业更好的名字:爱码士
- 【腾讯TMQ】漫步VR——Unity语音聊天室开发小结
- PRD:抖音APP产品需求文档
热门文章
- 卡诺模型案例分析_3个维度看竞品分析!
- MySQL(9)主从复制和读写分离
- mysql备份服务器中的_使用 Shell 备份远程服务器上的 MySQL 数据库到本机
- 【Mybatis-Plus】(一)初识Mybatis-Plus 入门案例
- window设置快捷键左右方向键
- weblogic命令行操作
- 如何把WAV格式音频转换为MP3格式
- 生活之难:生活到底难在哪里
- tmpfiles.d导致的unix:///tmp/supervisor.sock no such file坑(待续)
- intellij idea 最常用的快捷键