android webview javascript не работи с loadDataWithBaseUrl

Опитвам се да заредя данни в android webview с помощта на

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
благодаря ти gunar за обратната връзка. Реших проблема и сега моят уеб изглед реагира на потребителски кликвания. Проблемът, с който се сблъсквам, е, че зареждам моя уеб изглед със страница, която съдържа таблица n, когато потребителят щракне върху който и да е ред, аз наричам намерение, което зарежда някои изображения в зависимост от някои данни от клетки в този ред. Работи гладко при първото щракване, но приложението се затваря, без да дава грешка при второто щракване. Не разбирам. Заради паметта, която изображенията заемат ли е (всяко изображение е около 2MB bt и само dwnld само палци, което е приблизително 200kb, когато потребителят кликне върху ред)? как да разреша дис? - person raghavendra; 25.06.2013
comment
Като първи коментар: всеки въпрос на StackOverflow (SO) трябва да е достатъчно конкретен. След като сте попитали нещо, ако отговорът, който сте получили за ТОЗИ ВЪПРОС, е ОК, продължавате напред. За текущия ви въпрос бих отворил друга тема. Но тъй като го стартирахте: изображение от 200 kb ще заема още около три пъти в паметта, като се има предвид, че ще бъде декомпресирано. Вярвам, че трябва да преразгледате стратегията си за това, което приложението ви прави. Може би бихте могли да получите повече помощ, ако можете да посочите действителния си проблем в нов SO въпрос. - person gunar; 26.06.2013
comment
Няма проблем, текущият въпрос все още ли е в сила? - person gunar; 27.06.2013
comment
да, така е.. Изтеглям няколко превключващи изображения (резолюция ht*wd: 225*300) от сървъра, когато потребителят щракне върху ред в webview, той преглежда превключвателите и се връща към webview, приложението се затваря без грешка, когато кликва върху всеки ред за втори път - person raghavendra; 28.06.2013
comment
Трябва да има нещо разкриващо в Logcat, когато приложението се затваря. Можете ли да публикувате това? - person gunar; 28.06.2013
comment
Здравей gunar, според твоето предложение отворих нова тема за този въпрос, моля, виж: stackoverflow.com/questions/17365693/ и не, в logcat също няма записани регистрационни файлове за грешки - person raghavendra; 29.06.2013