Android addJavascriptInterace, вызов родной функции дает мне ошибку типа - PullRequest
0 голосов
/ 20 февраля 2012

Хорошо, ребята.Что я пытаюсь сделать: у меня есть некоторый бэкэнд-код, написанный на javascript (проект изначально должен был быть веб-приложением), и я добавил интерфейс javascript в мое веб-представление Android, и когда я нажимаюКнопка в моем пользовательском интерфейсе, код 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 вызывается, так что это не проблема.Функция javascript, которая вызывает onLoginStatusChange, выглядит следующим образом:

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 Ответ

4 голосов
/ 20 февраля 2012

Видимо, у веб-просмотра возникают проблемы, когда вы пытаетесь передать нативные функции в качестве обратных вызовов другим методам. Я создал новый файл .js, который работает как обратные вызовы, и все обратные вызовы js вызывают собственный метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...