Android addJavascriptInterace,调用本机函数出现 typeError
2012-02-20
957
好的,伙计们。我想做的是:我有一些用 javascript 编写的后端代码(该项目最初应该是一个 Web 应用程序),并且我已将 javascript 界面添加到我的 android Web 视图中,当我按下 UI 中的按钮时,javascript 代码会执行一些操作,然后在完成后调用 javascript 界面中的函数... 来自我的 javascript 界面的代码:
public void onReady() {
backend.loadUrl("javascript:dokus.backend.onLoginStatusChange(Bridge.onLoginStatusChange);");
backend.loadUrl("javascript:dokus.backend.onProjectsChange(Bridge.onProjectsChange);");
backend.loadUrl("javascript:dokus.backend.onLatestEntriesChange(Bridge.onLatestEntriesChange);");
}
public void onLoginStatusChange (boolean loggedIn, String error) {
Toast.makeText(mainActivity, "LoginStatusChange", Toast.LENGTH_SHORT).show();
}
...
我已经验证了 onReady 函数被调用,所以这不是问题。 调用 onLoginStatusChange 的 javascript 函数如下:
function _login_callback(loggedIn, msg) {
if (loggedIn) {
_get_projects();
_get_latest_entries();
}
console.log(_login_status_changed_callback);
if (_login_status_changed_callback !== undefined)
_login_status_changed_callback (loggedIn, msg);
}
我收到的错误是:“行:180,类型错误”。这就是我从 WebChromeView 函数中获得的全部内容,该函数打印从 console.log() 到 toast 消息的所有内容。
console.log(_login_status_changed_callback) 打印出以下内容:
function onLoginStatusChange () {
[native code]
}
我已验证该函数调用了正确的参数(一个布尔值和一个字符串),因此这也不应该是错误...我很茫然,我该怎么办?
Web 视图的设置代码:
private void setupBackend () {
final DokusActivity that = this;
backend = new WebView(this);
BackendBridge.getInstance().initInstance(this, backend);
backend.getSettings().setJavaScriptEnabled(true);
backend.getSettings().setDomStorageEnabled(true);
backend.addJavascriptInterface(BackendBridge.getInstance(), "Bridge");
backend.setWebViewClient(new WebViewClient() {
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
Toast.makeText(that, "Oh no! " + description, Toast.LENGTH_SHORT).show();
}
});
backend.setWebChromeClient(new WebChromeClient() {
public boolean onConsoleMessage (ConsoleMessage consoleMessage) {
Toast.makeText(that, "Oh no! " + consoleMessage.lineNumber() + ": " + consoleMessage.message(), Toast.LENGTH_SHORT).show();
return false;
}
});
backend.loadUrl("file:///android_asset/index.html");
}
1个回答
显然,当您尝试将本机函数作为回调传递给其他方法时,webview 会出现问题。我所做的是创建一个新的 .js 文件,该文件用作回调,所有 js 回调所做的就是调用本机方法。
Robin Heggelund Hansen
2012-02-20