Android addJavascriptInterace,调用native函数给我一个typeError

时间:2012-02-20 13:06:58

标签: android android-webview

好的伙计们。我正在尝试做什么:我有一些用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]
}

我已经验证了正确的参数被调用到函数(bool和一个字符串),所以这不应该是错误......我不知所措,我该怎么办?

网络视图的设置代码:

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 个答案:

答案 0 :(得分:4)

显然,当您尝试将本机函数作为回调传递给其他方法时,webview会出现问题。我所做的是创建一个新的.js文件,作为回调函数,所有js回调函数都调用本机方法。