webview中java与js交互
WebView提供了在Android应用中展示网页的强大功能。也是目前Hybird app的大力发展的基础。作为Android系统的一个非常重要的组件,它提供两方面的强大的能力:对HTML的解析,布局和绘制;对JavaScript的解释和执行。Hybird App的组成是Native+H5,Native部分是java语言实现;而JavaScript是H5中必不可少的部分。因此就会遇到Java与JavaScript互相调用的情况!这里记录了一个最基本的互相调用的例了!
1.Native布局中添加WebView组件
<WebView
android:id="@+id/wv_contacts"
android:layout_below="@id/tv_title"
android:layout_width="match_parent"
android:layout_height="match_parent">
</WebView>
2.初始化WebView,设置允许使用JavaScript并载入页面
private void initWebView() {
mWebView = (WebView) findViewById(R.id.wv_contacts);
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);
mWebView.loadUrl("file:///android_asset/constacts.html");
}
3.java调用javaScript(mWebView.loadUrl("javascript:method(param)");)
首先定义好JavaScript函数:
function showData(constactsData){
var html="";
var ullist = document.getElementById("contacts_list");
var constactsJsonData = eval(constactsData);
for(var i = 0; i < constactsJsonData.length; i++){
html += "<li onclick=callPhone(\"" + constactsJsonData[i].number + "\")>" + constactsJsonData[i].name + "</li>";
}
ullist.innerHTML = html;
}
然后在java调用JavaScript,放在onPageFinished回调中调用是为了保证,调用Js时,Js已全部加载完成
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
} @Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
showContactsInfo();
}
}); private void showContactsInfo() {
String info = jsInterface.readContacts();
mWebView.loadUrl("javascript:showData(" + info + ")");
}
4.在Js中调用Java(mWebView.addJavascriptInterface(new JavaScriptInterface(), "interface");)。如代码所示,在Js中调用Java Native方法。需要将需要调用的方法所属对象转化为一个别名。将这个别名透传到JavaScript中,然后在JavaScript中通过别名访问Native方法。
首先添加别名
mWebView.addJavascriptInterface(new JSInterface(this.getApplicationContext()), "jsinterface");
然后定义Native方法
public void callPhone(String number) {
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + number));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}
最后通过别名在JavaScript中进行调用
function callPhone(number){ jsinterface.callPhone(number); }
如果便完成了Hybird App中的最基本的Java和JavaScript的通信的功能!
最新文章
- NetBean 8 创建EJB
- 控制移动端页面的缩放(meta)
- 安装MySQL5.7
- C使用相关笔记
- method chaining
- struts2与cookie实现自动登录和验证码验证
- 【疯狂Java讲义学习笔记】【数据类型与运算符】
- 手把手教你从Core Data迁移到Realm
- Arcgis sde 10.1您不能创建在安装后的空间库,提示User has privileges required to create database objects.
- 认识ASP.NET MVC6
- iOS-延迟操作方法总结
- sgu176 Flow Construction【有源汇有上下界最小流】
- Mirantis MCP 1.0:OpenStack 和 Kubernetes 整合的第一步
- mysql 从一个表中查询,插入到另一个表中
- Luogu P2602 [ZJOI2010]数字计数
- spring 代理注解 <;aop:aspectj-autoproxy />;
- gitlab无法push或clone的错误:JWT::DecodeError (Nil JSON web token): lib/gitlab/workhorse.rb:120:in `verify_api_request!&#39;
- 首页设计的可用性和PET
- 从Objective-C到Swift,你必须会的(二)组合options
- Software Testing Techniques Homework 2
热门文章
- 【转】Mybatis Generator最完整配置详解
- iOS 详解NSXMLParser方法解析XML数据方法
- Modbus Poll master-slave测试 Dtech USB转485(worldsing 笔记)
- JavaScript要点(七) 函数调用
- 完全分布式Hadoop2.3安装与配置
- Android真机抓屏- Android Screen Monitor
- 利用sqlmap和burpsuite绕过csrf token进行SQL注入 (转)
- EXE文件结构及读取方法
- SQLSERVER复制表的方法
- android学习日记27--Dialog使用及其设计模式