从网上巴拉了很多都是有一丝丝问题不够完美 主要问题就是Android调用js不通。
问题场景js调用了Android后立马回调js方法出现调用无效。但是从点击时间调用js是没有问题的。
解决方案以及完整代码如下:
//开启JavaScript支持
mWebview.getSettings().setJavaScriptEnabled(true);
// 注册js调用Android对象 这李的Android参数与html方法要保持一致
mWebview.addJavascriptInterface(new Info(), "android");
mWebview.loadUrl("file:///android_asset/alert.html");
JS调用Android的方法类
/**
* js调用Android方法
*/
@SuppressLint("JavascriptInterface")
public class Info {
@JavascriptInterface
public void getInfo(String data) {
// js调用Android有参方法
ToastUtil.showShortToast(data);
toJs();
}
@JavascriptInterface
public void getInfo() {
// js调用Android 无参方法
ToastUtil.showShortToast("js调用无参");
toJs();
}
}
Android调用JS的方法
/**android调用js
* 必须要切换到UI线程!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*
* */
@JavascriptInterface
public void toJs() {
ThreadUtil.runOnUiThread(new Runnable() {
@Override
public void run() {
//注意test的''单引号
mWebview.loadUrl("javascript:javacalljswith(" + "'test'" + ")");
}
});
}
下面是html代码,这段代码可以放服务器远程访问效果是一样的,。
<html>
<head>
<meta http-equiv="Content-Type" charset="UTF-8"/>
<script type="text/javascript">
function javacalljs(){
document.getElementById("showmsg").innerHTML = "JAVA调用了JS的无参函数";
}
function javacalljswith(arg){
document.getElementById("showmsg").innerHTML = (arg);
}
</script>
</head>
<body>
<h3>Web模块</h3>
<h3 id="showmsg">调用js显示结果</h3>
<!--调用无参 window.android.getInfo() 注意这个android要和webview注册js时的第二个参数一样 -->
<!--// 注册js调用Android对象
mWebview.addJavascriptInterface(new Info(), "android");-->
<input type="button" value="Js调用Java代码" onclick="window.android.getInfo()"/>
<!--调用有参-->
<input type="button" value="Js调用Java代码并传参数" onclick="window.android.getInfo('Js传过来的参数')"/>
</body>
</html>
ThreadUtil工具类参考这三行代码
Looper mainlooper = Looper.getMainLooper();
Handler handler = new Handler(mainlooper);
handler.post(runnable);
网友评论