Android 自定义WebView弹窗及屏蔽弹窗

额,还是那个WebView的问题,内核已换成腾讯X5内核,所以接下来的内容会有一些X5内核的方法。但我们的H5是不能改的,还是只有委屈我们自己。先看看H5自带的弹窗

这样子的弹窗在不同的手机上呈现的可能是不同的效果,效果不统一,你家产品经理看了会高兴吗?哈哈哈。 其中,onJsPrompt弹出的内容在我们现在的项目上是无意义的。这个是之前AngularJS和Cordava项目。于是乎,对于onJsPrompt弹窗,我的做法是:

     @Overridepublic boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {//在defaultValue或message中,会返回一个url,我们项目中的下载的文件都是File路径下//如果不是File文件,则直接返回true来屏蔽弹窗。if (!defaultValue.contains("File") && !message.contains("File")) {result.confirm();return true;}result.confirm();webView.loadUrl(message);return true;}
复制代码

result.confirm();就是默认点确定,同理result.cancel();是取消操作

这样就可以轻松地屏蔽gay_init:2这样的无意义弹窗了,具体的可以根据message或者defaultValue的值来判断是否执行其他操作。 接下来是onJsAlert和onJsConfirm类型的,这样的弹窗我可是一眼就辨别出来了,因为从按键个数基本确定,onJsAlert只有一个,onJsConfirm嘛,肯定是有一个取消一个确定了。如果不能确定类型,可以分别复写几个方法,打上断点或者Log一下,也可以找到。

既然他俩就一个按键的区别,那就只贴onJsConfirm的了。样式是仿照IOS的效果来的,background自定义的,需要的留言,我只贴主要的,毕竟本文主要是讲WebView的。

xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:id="@+id/title"android:layout_width="match_parent"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/content"android:layout_width="match_parent"android:layout_height="wrap_content" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><Buttonandroid:id="@+id/certain"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="确定" /><Buttonandroid:id="@+id/cancel"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_marginLeft="@dimen/x1"android:layout_weight="1"android:text="取消"/></LinearLayout>
</LinearLayout>
复制代码

类里面:

    private AlertDialog confirmDialog;private boolean isCertain;@Overridepublic boolean onJsConfirm(WebView webView, String url, String message, final JsResult result) {confirmDialog = new AlertDialog.Builder(getContext(), R.style.alert_dialog_style).create();View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.window_user, null);TextView title = (TextView) view.findViewById(R.id.title);TextView content = (TextView) view.findViewById(R.id.content);Button cancel = (Button) view.findViewById(R.id.cancel);Button certain = (Button) view.findViewById(R.id.certain);title.setText("操作提示");//直接将返回的message信息设置到布局中content.setText("" + message);confirmDialog.setView(view);cancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {confirmDialog.dismiss();isCertain = false;}});certain.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {confirmDialog.dismiss();isCertain = true;}});confirmDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {@Overridepublic void onDismiss(DialogInterface dialog) {//根据isCertain来判断用户希望执行的是确定还是取消操作if (isCertain) {result.confirm();} else {result.cancel();}}});confirmDialog.show();WindowManager.LayoutParams params = confirmDialog.getWindow().getAttributes();params.width = (int) (ScreenUtils.getScreenWidth() * 0.9);params.height = LinearLayout.LayoutParams.WRAP_CONTENT;confirmDialog.getWindow().setAttributes(params);return true;}
复制代码

效果嘛,就这样啦。

一直以来,WebView对我来说是一个很难控制但是又不得不用的重要组件。经历了很多坑,包括谷歌大佬埋下的。不管怎么说,我们在遇到问题的时候,要不畏艰难,迎难而上。没有问题,制造问题,也要上。不要怂,就是干!共勉。

转载于:https://juejin.im/post/5a313cdc51882575cb741bd5

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

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

相关文章

【图像处理】——Python实现two_pass方法来进行连通域的提取

目录 一、相关知识 1、two_pass算法思想 2、并查集算法 二、自定义的two_pass算法

C++ 多线程使用future传递异常

如果 std::async 调用的函数抛出异常&#xff0c;那么这个异常会被存储在值的位置&#xff0c;同时 future 变为 ready ,如果调用 get() 会重新抛出存储的异常。 Note: 标准并没有指定原来的异常对象是被重新抛出或者拷贝后抛出&#xff0c;不同的编译器会做不同的选择。 对于 …

期货黄金与现货黄金比较

现货黄金与期货黄金是目前市场上最热门的黄金投资方式&#xff0c;与国内任何的金融投资品相比&#xff0c;都具有一定的优势。 其实金投网小编觉得现货黄金与期货黄金最主要的不同点是这个&#xff1a;期货黄金做的是国内市场&#xff0c;同股票市场一样&#xff0c;里面有庄家…

DNS域传送漏洞

0x00 相关背景介绍 Dns是整个互联网公司业务的基础&#xff0c;目前越来越多的互联网公司开始自己搭建DNS服务器做解析服务&#xff0c;同时由于DNS服务是基础性服务非常重要&#xff0c;因此很多公司会对DNS服务器进行主备配置而DNS主备之间的数据同步就会用到dns域传送&#…

封装之--通过类中公有方法访问私有成员变量

如何在ClassB中访问ClassA的私有成员变量&#xff1f;&#xff08;典型的封装案例&#xff09; 通过在ClassA中定义公有的成员方法&#xff0c;然后&#xff0c;在ClassB中通过ClassA的对象调用ClassA中的公有方法&#xff0c;来访问ClassA中的私有成员变量。 转载于:https://w…

匹配物镜放大倍数与相机像元尺寸

通常来说&#xff0c;相机内部的CCD或者CMOS传感器上都有感光阵列&#xff0c;由一个一个的感光元件构成&#xff0c;每一个感光元件负责完成光电转换的过程。简单理解&#xff0c;一个感光元件可以认为就是一个像素(pixel)或像元(pel)。像元具有一定尺寸&#xff0c;如果像的尺…

2016/11/10 kettle概述

ETL(Extract-Transform-Load&#xff0c;即抽取&#xff0c;转换&#xff0c;加载)&#xff0c;数据仓库技术&#xff0c;是用来处理将数据从来源&#xff08;以前做的项目&#xff09;经过抽取&#xff0c;转换&#xff0c;加载到达目的端&#xff08;正在做的项目&#xff09…

【深度学习】——非极大值抑制(nms/soft-nms)

目录 一、相关概念 1、iou 1&#xff09;理论计算 2&#xff09;Python代码&#xff08;代码参考yolov3模型util.py文件&#xff09; 2、nms 1)基本思路 2&#xff09;标准nms和soft-nms 3&#xff09;Python代码实现&#xff08;yolov3中util.py文件&#xff0c;增加了…

移动服务安全现状分析!

2019独角兽企业重金招聘Python工程师标准>>> 由于Android开源的环境&#xff0c;导致Android的整体环境都存在很多不安全的因素&#xff0c;同时用户在移动APP客户端的便捷应用&#xff0c;也给用户带来了巨大的安全隐患。未经过移动服务安全加固的APP存在被静态反编…

封装不同类模板的随机数生成器

最近准备刷题&#xff0c;打算简单封装下随机数生成器&#xff0c;方便产生测试数据。C11的STL提供了很多分布类型&#xff0c;我比较常用的是均匀分布&#xff0c;均匀分布的值有两种类型&#xff0c;一类是整数&#xff0c;另一类是浮点数&#xff0c;STL根据值的类型定义了两…

Log4j详细设置说明

1. 动态的改变记录级别和策略&#xff0c;即修改log4j.properties,不需要重启Web应用&#xff0c;这需要在web.xml中设置一下。2. 把log文件定在 /WEB-INF/logs/ 而不需要写绝对路径。3. 可以把log4j.properties和其他properties一起放在/WEB-INF/ &#xff0c;而不是Class-Pat…

【机器学习】——卷积神经网络(Keras)修改学习率(定值+自适应)

目录 1、直接获取现有模型的学习率 2、打印显示学习率 3、调整学习率 1&#xff09;1.LearningRateScheduler 2&#xff09;ReduceLROnPlateau 利用tensorflow的Keras模块我们可以建立我们自己定义的卷积神经网络模型&#xff0c;但是一般不会触碰到学习率这个问题&#x…

使用Docker构建你的第一个服务

1. 感受一下Docker的便捷 项目源码 https://github.com/MoonShining/dockernize-grape-helloworld clone下来以后运行,cd到项目目录下&#xff0c;运行 docker build -t api-sample . docker run -p 8080:8080 api-sample:latest 复制代码就可以访问localhost:8080看到效果了. …

MyEclipse连接MySQL

在官网http://www.mysql.com/downloads/下载数据库连接驱动 本文中使用驱动版本为mysql-connector-java-5.1.40 一、创建一个java测试项目MySQLConnectorsTest 在项目下穿件一个lib文件夹用来存放MySQL驱动包。 右键驱动包build path进行add添加操作&#xff0c;打开Referenced…

在Windows系统中配置Google AddressSanitizer

Google AddressSanitizer简介 AddressSanitizer (ASan) 是 C 和 C 的内存错误检测软件&#xff0c;它可以检测&#xff1a; 释放指针后继续使用堆缓冲区溢出栈缓冲区溢出全局缓冲区溢出返回后继续使用在范围之外继续使用初始化顺序的bug内存泄漏 在 Windows 系统中&#xff…

【剑指offer】——求出一个正整数的质数因子(Python)

目录 一、题目描述 二、思路 1、短除法 2、平方根法 一、题目描述 功能:输入一个正整数&#xff0c;按照从小到大的顺序输出它的所有质因子&#xff08;重复的也要列举&#xff09;&#xff08;如180的质因子为2 2 3 3 5 &#xff09; 最后一个数后面也要有空格 输入描述…

Python字符串笔录

python字符串操作实方法&#xff0c;包括了几乎所有常用的python字符串操作&#xff0c;如字符串的替换、删除、截取、复制、连接、比较、查找、分割等 1、去空格及特殊符号 >>> s 123 >>> s.strip() # 去除所有空格123 >>> s1 123 >>&…

第九周进度条

第六周学习进度条 星期一 星期二 星期三 星期四 星期五 星期六 星期日 所花时间 &#xff08;包括上课&#xff09; 无 上午8:00-9:50 无 无 下午4:00-5:00 下午3&#xff1a;00-5&#xff1a;30 代码量&#xff08;行&#xff09; 0行 260行 0行 0行 0行 0…

C++ STL实现的优先队列( priority_queue )

本文参考的源码版本&#xff1a;gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)。 priority_queue 本质是容器适配器&#xff0c;它对内部容器的元素有自己的管理方式&#xff0c;而 priority_queue 实际维护的是一个二叉堆。STL中 priority_queue 的…