详解 WebView 与 JS 交互传值问题

随着混合开发模式比较流行,很多时候,我们需要在原生的基础上,使用 WebView 加载网页,这样控制更加方便。今天我们来看看,如何将 Java 对象 和 List 集合传值给 JS 调用。

如何将 Java 对象实例传值给 JS

其实将我们在 Android 原生中将 Java 对象实例传值给 JS 承认并且可以使用的对象,方法非常简单。我们来举个例子。

html 文件

我们在本地写了一个 html 文件,放在 assets 目录中。

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试</title> <h1 id="name" ></h1> <h1 id="age"></h1> <h1 id="sex"></h1> <script> // Android需要调用的方法 function callJS(){ document.getElementById("age").innerHTML=person.getAge(); document.getElementById("name").innerHTML=person.getName(); document.getElementById("sex").innerHTML=person.getSex(); } </script> </head> </html>

看到 callJS() 函数中的 person 了吗?它就是我们传值进行的 Java 对象实例。直接就可以使用,获取了年龄,名字,和性别属性。那我们该如何声明该对象,才会被 JS 所承认呢?

Java 对象

来,看看,我们是如何创建 Person 这个实体类的。代码如下:

package com.loonggg.wedswebview; import android.webkit.JavascriptInterface; /** * Created by loonggg on 2017/5/11. */ public class Person { private String name; private String age; private String sex; @JavascriptInterface public String getAge() { return age; } public void setAge(String age) { this.age = age; } public void setSex(String sex) { this.sex = sex; } @JavascriptInterface public String getSex() { return sex; } @JavascriptInterface public String getName() { return name; } public void setName(String name) { this.name = name; } }

看到我们实体类 Person 中每个get方法的上面有一个 @JavascriptInterface 的注解了吗?它的意思就是告诉 JS ,这个可以用,所以我们在 Html 文件中,使用 person.get()对应的方法,可以获取到内容。

在 WebView 上是这样传值的:

webView.loadUrl("file:///android_asset/test_object.html"); final Person p = new Person(); p.setName("loonggg"); p.setAge("28"); p.setSex("男"); wv.addJavascriptInterface(p, "person"); wv.loadUrl("javascript:callJS()");

wv.addJavascriptInterface(p, “person”); 的意思就是注入 Java 对象 p 给 webview 为 person,在 JS 调用的时候,对应的就是 person 。

wv.loadUrl(“JavaScript:callJS()”);这句话的意思就是:调用JS中的方法 callJS()函数方法。

Java List如何传给 JS 呢?

其实按道理来说,是不可以将List集合直接传值给 JS 使用,但是既然对象可以传值,JS 可以调用 java 对象,也可以调用 Android 中的方法,那我们就一拆分的形式传过去。

Html 文件

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试</title> <h1 id="name" ></h1> <h1 id="age"></h1> <h1 id="sex"></h1> <h1>List传值测试</h1> <h1 id="name1" ></h1> <h1 id="age1"></h1> <h1 id="sex1"></h1> <script> // Android需要调用的方法 function callJS(){ document.getElementById("age").innerHTML=person.getAge(); document.getElementById("name").innerHTML=person.getName(); document.getElementById("sex").innerHTML=person.getSex(); } function callListJS(){ document.getElementById("age1").innerHTML=window.javatojs.getPersonObject(0).getAge(); document.getElementById("name1").innerHTML=window.javatojs.getPersonObject(0).getName(); document.getElementById("sex1").innerHTML=window.javatojs.getPersonObject(0).getSex() } </script> </head> </html>

拆分传值

如何拆分呢?就是在JS中调用 Android中的方法,里面可以按照索引返回集合中的对象,然后再获取对象中的属性。代码如下:

/** * 该方法将在js脚本中,通过window.javatojs.....()进行调用 * * @return */ @JavascriptInterface public Person getPersonObject(int index) { return list.get(index); } @JavascriptInterface public int getSize() { return list.size(); } list.add(p); wv.addJavascriptInterface(this, "javatojs"); wv.loadUrl("javascript:callListJS()");

整个Acitvity中所有的代码

public class MainActivity extends AppCompatActivity { private WebView wv; private List<Person> list = new ArrayList<Person>(); @SuppressLint("JavascriptInterface") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); wv = new WebView(this); setContentView(wv); WebSettings ws = wv.getSettings(); ws.setJavaScriptEnabled(true); ws.setUseWideViewPort(true);//适应分辨率 ws.setLoadWithOverviewMode(true); wv.loadUrl("file:///android_asset/test_object.html"); final Person p = new Person(); p.setName("loonggg"); p.setAge("28"); p.setSex("男"); wv.addJavascriptInterface(p, "person"); list.add(p); wv.addJavascriptInterface(this, "javatojs"); wv.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); wv.loadUrl("javascript:callJS()"); wv.loadUrl("javascript:callListJS()"); } }); } /** * 该方法将在js脚本中,通过window.javatojs.....()进行调用 * * @return */ @JavascriptInterface public Person getPersonObject(int index) { return list.get(index); } @JavascriptInterface public int getSize() { return list.size(); } }

效果图

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2024-11-09 01:01:31

详解 WebView 与 JS 交互传值问题的相关文章

Console命令详解,让调试js代码变得更简单

Console命令详解,让调试js代码变得更简单 Firebug是网页开发的利器,能够极大地提升工作效率. 但是,它不太容易上手.我曾经翻译过一篇<Firebug入门指南>,介绍了一些基本用法.今天,继续介绍它的高级用法. =================================== Firebug控制台详解 作者:阮一峰 出处:http://www.ruanyifeng.com/blog/2011/03/firebug_console_tutorial.html 控制台(Conso

javascript-安卓开发webview与js交互

问题描述 安卓开发webview与js交互 关于安卓webview与js交互的问题,我这里的附件是网上下载的一抽奖网页,我想把它加载在webview里,然后在webview里运行后能够弹出来相应的提示(Toast弹出),比如抽到苹果,就弹出来个Toast,提示苹果可能网页需要稍微修改一下,无奈自己做不出来啊,请大神帮助,最好上个成品,我这里实在是没有C币,上不了分了 附件地址 http://pan.baidu.com/share/link?shareid=3352172372&uk=406603

Android五分钟轻松教会你掌握WebView与JS交互

背景:Android API中提供了WebView组件来实现对html的渲染.现在HTML5.CSS3.jS的相关开发技术,以及数据交换格式json/XML.Web开发工程师的技能.为了减少对android的过度依赖,通常会在原生的Android 嵌入部分的html了. 这样一来就避免不了为js数据交互. 我们新建一个简单的布局,只有一个webview控件 <android:id="@+id/webView"  android:layout_width="fill_pa

Android中WebView与Js交互的实现方法_Android

获取WebView对象 调用WebView对象的getSettings()方法,获取WebSettings对象 调用WebSettings对象的setJavaScriptEnabled()方法,设置js可用,参数:布尔值 在判断是否支持js的时候,不要用alert(),默认不起作用,可以先用document.write()测试 调用WebView对象的addJavascriptInterface(obj, interfaceName)方法,添加js接口,参数:Object对象,String接口名

webview与js交互跳转-webView与js交互跳转到另一个activity会自动关闭

问题描述 webView与js交互跳转到另一个activity会自动关闭 自定义webView与js交互跳转到另一个activity会自动关闭,并且没走destroy()方法?求大神解释?

Android中WebView与Js交互的实现方法

获取WebView对象 调用WebView对象的getSettings()方法,获取WebSettings对象 调用WebSettings对象的setJavaScriptEnabled()方法,设置js可用,参数:布尔值 在判断是否支持js的时候,不要用alert(),默认不起作用,可以先用document.write()测试 调用WebView对象的addJavascriptInterface(obj, interfaceName)方法,添加js接口,参数:Object对象,String接口名

详解打开网页js报错问题

  打开网页js报错问题详解,具体内容如下所示: 最近时常会碰到网页报错的问题,因为最近图方便,会用到很多现成的js.  报错的解决,第一个就是看,找出错误,直接就是点右下角的,看一下第几行,然后,右键页面,看源代码,因为如果你直接进程序,有很多include的原因,显示的第几行第几行,很难弄清楚,然后,最简单的方法,一个一个js排除,删掉不能用的那个. 另外,如果几个js同时存在,而有1,2个不能正常运行是,改掉几个的名称,因为有的组件了,js的名称会冲突,最多见的就是jquery. 还有个就

webview和js交互

今天主要总结两点:一是使用Js去调用客户端公有方法,二是从客户端调用Js中的方法 一.JS调用客户端公有方法 上例子:(PS:不会写JS,就网上找了一段js代码) 新建项目,在项目的assets文件夹下创建一个test.html: [HTML] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 <body> <a>Web与Js交互:点击我,来调用客户端的show方法吧</a> <scri

JavaScript Event Loop机制详解与Vue.js中nextTick的实践应用

本文依次介绍了函数调用栈.MacroTask 与 MicroTask 执行顺序.浅析 Vue.js 中 nextTick 实现等内容;本文中引用的参考资料统一声明在 JavaScript 学习与实践资料索引. 1. 事件循环机制详解与实践应用 JavaScript 是典型的单线程单并发语言,即表示在同一时间片内其只能执行单个任务或者部分代码片.换言之,我们可以认为某个同域浏览器上下中 JavaScript 主线程拥有一个函数调用栈以及一个任务队列(参考 whatwg 规范);主线程会依次执行代码