在Android项目中我们或多或少会涉及到与js交互的问题,这其中WebView是必须掌握的控件,今天主要说说我们通过WebView调用js方法,然后如何很好的获取返回值。这里我总结了三种方式,大家可根据需求选择。

一、Android版本在4.4及以上
mWebView.evaluateJavascript("javascript:jsMethod()", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
//value即为js返回值
}
});
如果你项目最低支持版本在4.4以上,那这种方式最简单最完美,否则会报以下警告:

Call requires API level 19 (current min is 14): android.webkit.WebView#evaluateJavascript
二、Android4.4以下版本
虽说现在4.4以下版本不多了,但是只要存在,我们就需要努力兼容。

第一步,利用WebView的loadUrl()方法,调用js的alert方法,

mWebView().loadUrl("javascript:alert(jsMethod())");
第二步,在alert回调中的message就是我们想要的返回值

mWebView.setWebChromeClient(
new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
//message即为返回值
result.confirm();
return true;
}
);
返回值虽然拿到了,但是这种方法缺点挺多的:

1、不能忘记在回调中调用result.confirm,否则webview会出现奇怪的不可控现象,大家可以去掉试试;

2、onJsAlert方法要return true,表示我们自己处理alert,不需要js管啦;

3、js在alert方法中别return一个值回来,否则也会出现奇怪现象;

4、在华为Android版本8.0以上的某些机型中,会出现无法拦截js的alert,会直接将js的alert弹框弹出,很难受。。。

三、最稳妥的方法
这种方法需要和js协调好,双方配合完成:

1、我们同样利用WebView的loadUrl()方法,调用js普通方法

mWebView().loadUrl("javascript:jsMethod()");
2、给js注入一个方法,且加入参数,并和js开发人员约定,当我们调用其第一步中的jsMethod方法,他调用我们注入的方法,并将返回值传回

mWebView().addJavascriptInterface(this, "viewpager");

@JavascriptInterface
public void getResult(String str) {
//str 即为返回值
}
OK!搞定啦,到此你就可以开心的与js交互,并拿到他的返回值啦!希望我的总结可以帮助到你~

---------------------
作者:康小白Code
来源:CSDN
原文:https://blog.csdn.net/k_bb_666/article/details/86673983
版权声明:本文为博主原创文章,转载请附上博文链接!

WebView调用js方法获取返回值的完美解决方案的更多相关文章

  1. [Python陷阱]os.system调用shell脚本获取返回值

    当前有shell个脚本/tmp/test.sh,内容如下: #!/bin/bashexit 11 使用Python的os.system调用,获取返回值是: >>> ret=os.sy ...

  2. oc 通过webView调用js方法

    - (void)viewDidLoad { [super viewDidLoad]; //加载本地web页面 web = [[UIWebView alloc]init]; web.background ...

  3. JS模态窗口返回值兼容问题解决方案

    因系统要兼容原IE已使用的关闭方法,经调试测得,需对window.dialogArguments进行再较验,不然易出问题. function OKEnd(vals) { if (vals == nul ...

  4. 标签中的onclick调用js方法传递多个参数的解决方案

    1.JS方法 <script type="text/javascript"> funcation cc(parameter1,parameter2,parameter3 ...

  5. Struct2_使用Ajax调用Action方法并返回值

    一.Login.jsp 1.<head>引入jquery: <script type="text/javascript" src="http://aja ...

  6. 7 -- Spring的基本用法 -- 10... 获取其他Bean的属性值;获取Field值;获取任意方法的返回值

    7.10 高级依赖关系配置 组件与组件之间的耦合,采用依赖注入管理:但基本类型的成员变量值,应直接在代码中设置. Spring支持将任意方法的返回值.类或对象的Field值.其他Bean的getter ...

  7. 工作随笔——Java调用Groovy类的方法、传递参数和获取返回值

    接触Groovy也快一年了,一直在尝试怎么将Groovy引用到日常工作中来.最近在做一个功能的时候,花了点时间重新看了下Java怎么调用Groovy的方法.传递参数和获取返回值. 示例Groovy代码 ...

  8. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  9. Selenium2学习-036-WebUI自动化实战实例-034-JavaScript 在 Selenium 自动化中的应用实例之六(获取 JS 执行结果返回值)

    Selenium 获取 JavaScript 返回值非常简单,只需要在 js 脚本中将需要返回的数据 return 就可以,然后通过方法返回 js 的执行结果,方法源码如下所示: /** * Get ...

随机推荐

  1. MySQL Windows安装连接

    1.首先进入mysql的安装目录下的bin目录,例如我的是[C:\WINDOWS\System32\cmd.exe]   2.接着输入cmd,回车     3.在命令行中输入命令[mysql -hlo ...

  2. DNSMaper 一款子域名枚举与地图标记工具

    DNSMaper DNSMaper拥有与众多子域名枚举工具相似的功能,诸如域传送漏洞检测,子域名枚举,IP地址获取 文件说明├── dnsmaper.py(核心代码)├── dnsmapper.png ...

  3. Computer Vision_33_SIFT:Improving Bag-of-Features for Large Scale Image Search——2010

    此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...

  4. linux 安装 wkhtmltox

    linux安装wkhtmltox wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox- ...

  5. linux 基础9-账号与身份管理

    1. linux的账号与群组 1.1 账户名称:/etc/passwd: head -n 5 /etc/password #取前5行 账号名称,对应UID 密码,早期是在这里,后来转到了/etc/sh ...

  6. vue sample

    <template> <section> <header class="top_tips"> <span class="num_ ...

  7. Tcp/IP协议详讲

    TCP/IP协议分层详解 目录 TCP/IP 和 ISO/OSI TCP/IP分层模型 数据的封装与分用 其他相关概念 TCP/IP 通信传输流 负责传输的 IP 协议 正文 回到顶部 TCP/IP ...

  8. LightOJ - 1151 Snakes and Ladders

    LightOJ - 1151 思路: 将期望dp[x]看成自变量,那么递推式就可以看成方程组,用高斯消元求方程组的解就能求解出期望值 高斯消元求解的过程也是期望逆推的过程,注意边界情况的常数项,是6/ ...

  9. windows下对socket的send和recv的超时设置,并附一个简洁明了的socket简单demo

    设置方法 int nNetTimeout=10000;//10秒,    //设置发送超时    setsockopt(m_socket,SOL_SOCKET,SO_SNDTIMEO,(char *) ...

  10. 创建conda虚拟环境以及python的virtualenv虚拟环境

    我觉得我,嗯...可能脑袋里面有水 首先说一个,就是我电脑安装了conda2和conda3,原来怎么查看conda版本都是2,所以就没有创建虚拟环境 系统变量里面的path要改,总共有3个: D:\A ...