介绍
在android开发项目中,我们经常会将一些功能放在html中,比如一些活动界面,版权界面之类的,或者分了分流一下视频区的流量,可能会在流量大的时候,打开web的接口。这时我们知道使用html界面要用到webview,而使用android时也需要注意与非源生的交互,就是android和js的互相调用。
配置
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("file:///android_asset/web.html");
这里首先让webview支持javascript,然后作为demo直接加载本地的html。
android调用js方法
直接在onclick事件中写
webView.loadUrl("javascript:javacalljs()");
webView.loadUrl("javascript:javacalljswith(" + "'参数'" + ")");
string就是js的方法名。
对应js的代码
function javacalljs(){
document.getElementById("content").innerHTML =
"<br\>JAVA调用了JS的无参函数";
}
function javacalljswith(arg){
document.getElementById("content").innerHTML =
("<br\>"+arg);
}
js调用java
我们先看下js代码
<input type="button" value="js调用java" onclick="window.android.startFunction()" />
<input type="button" value="js调用java传递参数" onclick="window.android.startFunction('参数')" />
在android中我们需要使用addJavascriptInterface方法添加js的方法。
webView.addJavascriptInterface(MainActivity.this, "android");
android就是js中对应的命名空间
以下我们可以直接在MainActivity里面写注解方法:
@JavascriptInterface
public void startFunction(final String text) {
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
@JavascriptInterface
public void startFunction() {
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
或者我们将js方法全部写在一个类里面,比如JsonObject。
实例化的时候将 context和handler传过去,用于上下文和回调。
jsObject = new JsObject(MainActivity.this,mHandler);
在添加接口时将对象传入:
webView.addJavascriptInterface(jsObject, "android");
然后直接在jsonObject类下写注解方法即可,再用handler回调,这样方便管理。
其他
如果我们多次addJavascriptInterface的时候,在对象不同的情况下,比如我们先
webView.addJavascriptInterface(MainActivity.this, "android");
再
webView.addJavascriptInterface(jsObject, "android");
那么只有后面的生效,前面的被覆盖。
但是我们要增加多个空间的话
webView.addJavascriptInterface(MainActivity.this, "android");
webView.addJavascriptInterface(MainActivity.this, "java");
这样是可行的,俩个均有效果。
网友评论