今天遇到一个需求,项目中原来的原生界面要改为H5,但是这个这个界面中的某些点击事件还是要在原生代码里去处理,这就需要我们在JS中调用Android原生代码,正好趁着今天做了这个需求,写个简单的例子,把这个问题总结一下:
第一步:显示WebView
private JavaScriptUtil mJavaScriptUtil;//Js调用原生的工具类,为了以后书写方便,可以将项目中所有调原生的方法都写在一起 当然这里我们只举一个例子
WebView webView = findViewById(R.id.web_view);
webView.getSettings().setJavaScriptEnabled(true);//支持Js
mJavaScriptUtil = new JavaScriptUtil(WebViewActivity.this);//只是为了将当前Activity的上下文环境,传入工具类,为了在工具类中启动一个Activity(当然这个根据实际情况去加)
webView.addJavascriptInterface(mJavaScriptUtil, "jsAlias");//这个是上面工具类对象的实例 第二个是在js中调用的别名,这个需要和前端人员商定
// webView.loadUrl("https://www.baidu.com/");
webView.loadUrl("file:///android_asset/webview.html");//加载本地html文件
第二步:JavaScriptUtil工具类
public class JavaScriptUtil {
private Context mContext;
public JavaScriptUtil(Context mContext) {
this.mContext = mContext;
}
@JavascriptInterface
public void receiveByJs(String text, int count) {//receiveByJs 这个方法是接收来自H5的点击事件,同样方法名是自定义,但是要和前端商定
Toast.makeText(mContext, count + text + "", Toast.LENGTH_SHORT).show();//这一句,就是测试从H5页面带来的数据
mContext.startActivity(new Intent(mContext, MainActivity.class));//Activity跳转
}
第三步:本地html文件,里面代码很简单,其中要注意jsAlias.receiveByJs(“测试数据1”,2)中的jsAlias和receiveByJs都是我们在Android原生代码中自定义的,使用时Android的代码和html中的代码要统一,不然不会生效
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function showOnclick() {
jsAlias.receiveByJs("测试数据1",2);
}
</script>
</head>
<body>
<h1>Js调用原生代码</h1>
<p onclick="showOnclick()">点击事件</p>
</body>
</html>
了解以上三步后,就可以实现在JS中去调用Android原生代码了,在代码里我已经注释了很多,可以看看。但是里面有一些规则,最好自己写一个例子去理解,这样会更加深刻。
如果有错的或者说的不准确的地方,请联系我,及时改正,谢谢大家