Javascript для веб-просмотра Android не работает с loadDataWithBaseUrl

Я пытаюсь загрузить данные в веб-просмотр Android, используя

webview.loadDataWithBaseURL("", htmlcontent, "text/html", null, "");

метод возвращает htmlContent из StringBuilder, который заполняет данные html.

Я включил javascript и установил webChromeClient следующим образом

webview.getSettings().setJavaScriptEnabled(true);
webview.setWebChromeClient(new WebChromeClient());
webview.addJavascriptInterface(new JSClass(), "Android");

мой интерфейс к javascript:

class JSClass {
    public void getHTMLContent(String html)
    {
        Log.i(Global.TAG, "HTMLContentReceived: "+html);
    }
}

и мой javascript на странице html:

<script type="text/javascript">
    var ele = document.getElementsByClassName('test');
    for(var i=0;i<ele.length;i++){
        ele[i].onclick = function(){
            window.Android.getHTMLContent(this.innerHTML);
        }
    }
</script>

но почему-то javascript не возвращает никакого значения. Он отлично работает с loadData (url), где URL-адрес — это простая веб-страница в папке с ресурсами.

Помогите пожалуйста Заранее спасибо


person raghavendra    schedule 20.06.2013    source источник
comment
Исправлено!! просто добавьте javascript в свою деятельность, используя webview.loadUrl(javascript://здесь находится ваш javascript); после webview.getSettings().setJavaScriptEnabled(true); в приведенном выше коде, и он работает без сбоев! Надеюсь, поможет   -  person raghavendra    schedule 20.06.2013


Ответы (1)


У вас нет базового URL-адреса, так как вы загружаете динамически сгенерированный HTML. По этой причине webview.loadData(htmlcontent, "text/html", null); должно быть более чем достаточно.

Javascripts не генерируют никаких исключений в коде Java. Помните, что JS не такой типобезопасный/строгий, как код Java... Мой способ сделать это - поместить журналы между конфиденциальными вызовами Javascript, чтобы увидеть, проходит ли эта строка, и проверить значения. Поскольку вы не предоставили HTML, я бы настроил WebChomeClient и переопределил onConsoleMessage:

webview.setWebChromeClient(new MyChromeClient());

private class MyChromeClient extends WebChromeClient {
        @Override
        public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
            String message = consoleMessage.message() + " -- line " + consoleMessage.lineNumber();
            switch (consoleMessage.messageLevel()) {
            case ERROR:
                logErrorMessage(message);
                break;
            default:
                logInfoMessage(message);
                break;
            }
            return true;
        }

        private void logInfoMessage(String message) {
            Log.i("JSTag", message);
        }

        private void logErrorMessage(String message) {
            Log.e("JSTag", message);
        }


    }

Затем из вашего JavaScript вы должны позвонить, например: console.log('check my value:' + (ele != null)). Подробнее об этом здесь.

Глядя на ваш код JavaScript, я не могу понять, на что указывает this.innerHTML.

person gunar    schedule 20.06.2013
comment
спасибо гунар за отзыв. Я решил проблему, и теперь мой веб-просмотр реагирует на клики пользователя. Проблема, с которой я сталкиваюсь, заключается в том, что я загружаю свой веб-просмотр со страницей, которая содержит таблицу n, когда пользователь нажимает на любую строку, я вызываю намерение, которое загружает некоторые изображения в зависимости от некоторых данных ячейки в этой строке. Он работает плавно при первом нажатии, но приложение закрывается без каких-либо ошибок при втором нажатии. Я не понимаю y. Это из-за памяти, которую потребляют изображения (каждое изображение составляет около 2 МБ, но только большие пальцы, что составляет примерно 200 КБ, когда пользователь нажимает на строку)? как решить дис? - person raghavendra; 25.06.2013
comment
В качестве первого комментария: каждый вопрос StackOverflow (SO) должен быть достаточно конкретным. Как только вы что-то спросили, если ответ, который вы получили на ЭТОТ ВОПРОС, ОК, вы идете дальше. Для вашего текущего вопроса я бы открыл другую тему. Но, раз вы его запустили: образ размером 200кб будет занимать в памяти еще примерно в три раза с учетом того, что он будет распакован. Я считаю, что вам следует пересмотреть свою стратегию в отношении того, что делает ваше приложение. Возможно, вы могли бы получить больше помощи, если бы могли изложить свою актуальную проблему в новом вопросе SO. - person gunar; 26.06.2013
comment
Нет проблем, текущий вопрос остается в силе? - person gunar; 27.06.2013
comment
да, это так .. Я загружаю несколько превьюшек изображений (разрешение ht * wd: 225 * 300) с сервера, когда пользователь щелкает строку в веб-просмотре, он просматривает превью и возвращается в веб-просмотр, приложение закрывается без каких-либо ошибок, когда он кликает по любой строке второй раз - person raghavendra; 28.06.2013
comment
В Logcat должно быть что-то раскрывающее, когда приложение закрывается. Вы можете опубликовать это? - person gunar; 28.06.2013
comment
Привет, гунар, по вашему предложению я открыл новую тему для этого вопроса, пожалуйста, обратитесь: stackoverflow.com/questions/17365693/ и нет журналов ошибок, записанных в logcat. - person raghavendra; 29.06.2013