##Android与JS调用的坑
###1.Android调用JS的准备工作
`
m_webView.getSettings().setTextSize(TextSize.LARGER);
m_webView.getSettings().setJavaScriptEnabled(true);
m_webView.getSettings().setDomStorageEnabled(true);
String appCachePath = getApplicationContext().getCacheDir()
.getAbsolutePath();
m_webView.getSettings().setDatabasePath(appCachePath);
m_webView.addJavascriptInterface(this, JSINTERFACE_OBJ);
`
m_webView.addJavascriptInterface(this, JSINTERFACE_OBJ); 这个方法需要的最低api是17,
在调用此方法的方法上需要加载一个注解@SuppressLint("JavascriptInterface")
而this,通常是写一个内部类,去专门与JS交互的.
###2.如何查看JS的方法有没有调用成功?
`
@JavascriptInterface
public void jsLOG(String log) {
if (IS_DEBUG) {
Log.i("HTMLDT", "js:" + log);
}
}
`
通常是在Java代码中写一个log方法,方便后面的日志查看.
###3.在js中如何调用Java代码?
我们在问题1中的准备工作中,有一个JSINTERFACE_OBJ,这是为Java起的一个别名,我们在JS中调用Java代码时,可以如下:
`
function solve(topicID){
EXAMWin.jsLOG("solve():" + topicID);
var param = "#" + topicID + " [type='written by hand']";
var obj = $(param);
var i = 0;
var answerA = new Array();
...
省略代码
`
这里的EXAMWin,就是JSINTERFACE_OBJ,起的别名.
也就是说 别名.Java方法名(参数),就可以调用Java代码了
需要注意的是Java代码方法头上必须要有注解@JavascriptInterface
这个比较坑,为了统一规范,Java上的方法以js开头.
###4.Java如何调用JS方法?
封装一个方法去调用JS方法如下:
`
private void CallJs(String method, String param) {
StringBuffer jsParam = new StringBuffer();
jsParam.append("javascript:");
jsParam.append(method);
jsParam.append("(");
jsParam.append(param);
jsParam.append(")");
m_webView.loadUrl(jsParam.toString());
}
`
其实就是调用m_webView.loadUrl("javascript:方法名("+方法参数+")");
要注意的是在调用上面的方法之前,webView还必须先加载了一个HTML文件
m_webView.loadUrl(m_paperPath);这里的m_paperPath,是自己拼接的一个HTML文件.
###5.js调用Java方法,Java方法是一个回调方法时
`
@JavascriptInterface
public void selectionChanged(final String range, final String text, final String handleBounds, final String menuBounds){
if(this.listener != null) {
mHandler.post(new Runnable() {
@Override
public void run() {
listener.tsjiSelectionChanged(range, text, handleBounds, menuBounds);
}
});
}
}
`
需要使用Handler去调用post方法,直接调用listener.tsjiSelectionChanged(range, text, handleBounds, menuBounds);
此方法可能会导致,JS调用失效.
###6.查看调用JS日志的小技巧
其实也通用Android日志查看.
adb shell
然后 logcat -s TAG
这里的TAG,就是我们的log标签,注意不需要添加引号
网友评论