Android原生和H5交互;Android和H5混合开发;WebView点击H5界面跳转到Android原生界面。
2024-09-21 12:37:09
当时业务的需求是这样的,H5有一个活动商品列表的界面,IOS和Android共用这一个界面,点击商品可以跳转到Android原生的商品详情界面并传递商品ID; 大概就是点击H5界面跳转到Android原生界面;
好了,需求已经分析完毕了,Android只需要获取H5的点击事件和传递的参数;
来,上代码:
/启用支持javascript
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
Android4.2以上需要@JavascriptInterface注解,其目的是为了安全;
public class JavaScriptObject{
public JavaScriptObject(Activity activity) {
}
@JavascriptInterface
public void setToken(String token){
//token就是商品的ID,这里拿到商品的ID后直接跳转到商品详情页,并把id传递过去
}
@JavascriptInterface
public void definedShare(String ShareJson){
}
}
/*
*添加js接口,参数1是本地类名,参数2是标记;H5调用需要 "window.标记.类名中的方法名" 才能调用
*/
webView.addJavascriptInterface(new JavaScriptObject(this), "android");
到这里Android端需要写的就完成了;
这个是我截的图,可以看一下:
这里是H5需要写的代码:
<script type="text/javascript">
function s(){
//调用Android的setToken()方法
var result =window.android.setToken(goodsId);
document.getElementById("p").innerHTML=result;
}
</script>
----------------------------------------------------------------------------------------------------------------------------------
附:如果在Android端调用H5中的方法:
/*
* Android调用H5中的方法
*/
//传固定字符串可以直接用单引号括起来
mWebView.loadUrl("javascript:alertMessage('哈哈')");//访问H5里带参数的方法,alertMessage(message)为H5里的方法
//当出入变量名时,需要用转义符隔开
String content="1016";
mWebView.loadUrl("javascript:alertMessage(\"" +content+ "\")" );
//Android调用有返回值js方法,安卓4.4以上才能用这个方法
mWebView.evaluateJavascript("11", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
Log.i(TAG, "js返回的结果为=" + value);
}
});
抽成方法:
private void callJS(String callback, String status) {
if (TextUtils.isEmpty(status)) {
if (AndroidUtils.isKitkat()) {
mWebView.evaluateJavascript("javascript:" + callback + "()", null);
} else {
mWebView.loadUrl("javascript:" + callback + "()");
}
} else {
if (AndroidUtils.isKitkat()) {
mWebView.evaluateJavascript("javascript:" + callback + "('" + status + "')", null);
} else {
mWebView.loadUrl("javascript:" + callback + "('" + status + "')");
}
}
}
最新文章
- NameError: name &#39;sys_platform&#39; is not defined
- (转)struts2:数据校验,通过XWork校验框架实现(validation.xml)
- hdoj 2066 一个人的旅行
- Cordova for iOS[ PhoneGap]
- C 语言学习的第 03 课:你的 idea 是怎么变成能够执行的程序的
- leetcode:32 最长有效括号
- [R语言]foreach和doParallel包实现多个数据库同时查询
- 有没有好用的开源sql语法分析器? - 匿名用户的回答 - 知乎
- UIKit: UIResponder(转自南峰子博客)
- 浙大pat 1048 题解
- Apache Spark 章节1
- js各种获取当前窗口页面宽度、高度的方法
- 使用getCurrentPosition方法实时获取当前Geolocation信息(附源码文件)--html5、JavaScript
- .net中的SelectList在Html.DropdownList中的使用
- Process Class (System.Diagnostics)
- [Arc058E] Iroha and Haiku
- Bootstrap学习js插件篇之标签页
- 【模拟】 Codeforces Round #434 (Div. 1, based on Technocup 2018 Elimination Round 1) C. Tests Renumeration
- redis实现发布订阅
- 无类型指针 在delphi中可以直接赋值任何指针类型。
热门文章
- MySQL之 从复制延迟问题排查
- dnstop DNS分析工具
- JS 从HTML页面获取自定义属性值
- MySQL体系架构
- 基于redis 3.x搭建集群环境
- Vivado HLS初识---阅读《vivado design suite tutorial-high-level synthesis》(4)
- MySQL 快速构造一亿条记录的表
- 【react】---Immutable的基本使用
- python selenium right click on an href and choose Save link as... on Chrome.
- 如何修改CSV文件的分隔符