Android Webview使用小结
作者:lijiao 发布时间:2022-12-06 07:26:19
本文实例为大家分享了Android Webview使用小结,供大家参考,具体内容如下
#采用重载URL的方式实现Java与Js交互
在Android中,常用的Java与Js交互的实现方式是通过函数addJavascriptInterface进行添加在Js中使用的回调代理类。
这种方法虽然方便,但是写出来的js代码并不通用。如果IOS也要实现类似的功能或业务,则IOS要另外写一套Js代码。所以不太推荐。
推荐使用重载URL的方式来实现,因为基本所有的平台都拥有在加载某个URL之前进行一些处理的回调函数。所以这种方式会更加的通用。
#响应Javascript中的alert
在Android的WebView控件中,默认对JS的alert函数是没有任何反应的
要想弹出对应的对话框,则需要我们自己进行实现
具体实现代码如下:
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebChromeClient(new WebChromeClient(){
@Override
public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("测试alert");
builder.setMessage(message);
builder.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.confirm();
}
});
builder.show();
return true;
}
});
通过以上代码就可以实现当JS中执行alert时,在Android上以原生的对话框显示出来,当然这里也可以直接Toast。
而这段代码中需要注意的地方有两点:
1、返回值必须为true。
返回true,则说明已经处理了,不需要交由WebChromeClient来执行。而如果返回的是false,则Webview会继续执行后续的js代码,现象就是,弹出对话框之后,用户还没点确定,后续的js代码已经执行完了.
2、最后必须调用result.confirm()。
原因在于,如果没有调用此函数,则后续的JS代码将无法继续执行下去。最常见的现象就是,alert对话框只出现一次,第二次再进行alert的时候没有任何反应。其实这里是因为没有调用confirm函数,就相当于在浏览器中alert之后,用户没有点确定。
3、result.confirm()应该放到onClick回调中。
正如前面说的,调用confirm函数,就相当于用户点击了确定按钮。因此,我们要把confirm函数的调用放到Android原生对话框的“确定”按钮的回调函数中进行调用。
之前没理解透,把confirm函数放在了builder.show之后进行调用,结果现象是alert之后,对话框弹出来了,但是后续的js代码没有阻塞,而是继续执行下去了,变得就像是异步了一样,和在chrome中调用js代码的执行逻辑不一致。
不过,如果需求就是要直接执行下去,那也可以,只要理解了就行。
#访问证书有问题的SSL网页
对于有证书问题的网页,比如过期、信息不正确、发行机关不被信任等,Webview默认情况下会拒绝访问。而PC端浏览器的处理则是提供用户进行选择是否要继续,在android也是可以实现的。
首先第一种是直接继续,不需要让用户进行选择
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
// 默认为调用handler.cancel()方法,因此不要调用super的onReceivedSslError方法
// super.onReceivedSslError(view, handler, error);
handler.proceed();
}
这里要注意的是,千万不要调用super的onReceivedSslError方法,因为此方法中已经调用了handler.cancel()。
如果调用了,则会出现第一次无法加载,第二次却能正常访问的现象。
#慎重在shouldoverrideurlloading中返回true
当设置了WebviewClient时,在shouldoverrideurlloading中如果不需要对url进行拦截做处理,而是简单的继续加载此网址。
则建议采用返回false的方式而不是loadUrl的方式进行加载网址。
为什么这么建议呢?
因为如果采用loadUrl的方式进行加载,那么对于加载有跳转的网址时,进行webview.goBack就会特别麻烦。
例如加载链接如下:
A->(B->C->D)->E 括号内为跳转
如果采用return false的方式,那么在goBack的时候,可以从第二步直接回到A网页。从E回到A只需要执行两次goBack
而如果采用的是loadUrl,则没办法直接从第二步回到A网页。因为loadUrl把第二步的每个跳转都认为是一个新的网页加载,因此从E回到A需要执行四次goBack
只有当不需要加载网址而是拦截做其他处理,如拦截tel:xxx等特殊url做拨号处理的时候,才应该返回true。
#onFormResubmission
原文链接:http://zlv.me/posts/2015/01/14/08_Android-Webview使用小结/
猜你喜欢
- 目标效果: 点击动画按钮之后每张牌各自旋转 散开到屏幕上半部分的任意位置之后回到初始位置 比较像LOL男刀的技能动画 : )1: 创建卡牌对
- 本文实例为大家分享了Unity实现虚拟键盘的具体代码,供大家参考,具体内容如下这是一个网上找的插件,自己改了点东西,方便使用在项目中。暂时不
- 具体实现方式不多说了,请看下文一、前言当下微信公众号几乎已经是每个公司必备的,但是大部分微信公众账号用户体验都欠佳,特别是涉及到用户绑定等,
- 一,准备沙箱环境1,登录支付宝,进入 应用列表界面 https://openhome.alipay.com/dev/workspace2,如
- 还原背景大家都做过b-s架构的应用,也就是基于浏览器的软件应用。现在呢有个场景就是FE端也就是前端工程是前后端分离的,采用主流的前端框架VU
- 阿里终面在线编程题,写出来与大家分享一下 有一个单向链表
- SharedPreferences介绍:SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置
- 一、jaxb是什么 JAXB是Java Architecture for XML Bindi
- Java命令运行jar 报错运行jar命令java -jar xxx.jar报错:Caused by: java.lang.ClassNot
- 1、什么是Spring MVC?Spring MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用
- 导出Excel的框架有很多种,POI相对来说比较老了,很多Excel框架底层都是POI、有EasyPoi、EasyExcel、包括Hutoo
- mybatis的环境搭建:1、创建maven工程并且导入坐标:即我们需要在pop.xml文件中添加我们需要的依赖具体方法:搜索maven中央
- @JsonFormat处理LocalDateTime失效Failed to convert property value of type &
- 冒泡排序法:关键字较小的记录好比气泡逐趟上浮,关键字较大的记录好比石块下沉,每趟有一块最大的石块沉底。算法本质:(最大值是关键点,肯定放到最
- 这段C#代码主要是验证身份证的开头和身份证的格式和长度是否正确,没有按照身份证的编码规则进行严格验证/// <summary>
- 前言我们在日常的开发过程中针对一些字段采用整型的方式去代替某些具体的含义,比如性别0代表男,1代表女。如果只是一些不会变更的转译我们可以采用
- 一、ArrayList是什么ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元
- springMVC项目中实现图形验证码功能,可以使用kaptcha来实现,下面是步骤一、引入架包,pom.xml<dependency
- 前提在日常使用SpringMVC进行开发的时候,有可能遇到前端各种类型的请求参数,这里做一次相对全面的总结。SpringMVC中处理控制器参
- 在实际应用中,我们往往有需要比较两个自定义对象大小的地方。而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我