Изменения на веб-странице через javascript не отображаются в WebView. Есть ли способ заставить WebView перерисовать свой контент?

Вот необходимые шаги:

  • Загрузите локальный HTML-файл с помощью WebView.loadUrl().
  • Этот локальный файл html имеет несколько методов javascript, которые изменяют страницу. Например, добавить изображение или изменить размер текста.
  • Вызовите один из этих методов, используя WebView.loadUrl("javascript:somefunction()");

Это прекрасно работает. Изменения хорошо видны.

Однако, если страница прокручивается во время вызова, происходит что-то действительно странное. Вызывается javascript, и, глядя на ведение журнала, DOM изменяется, и на этом уровне все прошло так, как ожидалось. Однако WebView не показывает обновление. Если вы затем сделаете что-то, чтобы заставить его перерисовать себя, например, поверните устройство или снова вызовите один из методов javascript (но на этот раз без прокрутки), предыдущие изменения, наконец, появятся.

Таким образом, кажется, что есть какая-то странная ошибка, когда изменения на странице с помощью javascript не обновляются в пользовательском интерфейсе WebView, если в то время страница была затронута или прокручена.

Это действительно воспроизводимо на Nexus One 2.2, и мы видели это на других устройствах. Кто-нибудь знает, что здесь происходит? Есть ли недействительный метод, который заставляет перерисовывать веб-контент?

Спасибо.


person cottonBallPaws    schedule 03.03.2011    source источник
comment
Вы решили эту проблему? У меня аналогичный случай - при нажатии я добавляю и удаляю стиль css. Стиль добавляется, но не удаляется в пользовательском интерфейсе, пока я не поверну устройство... тогда все работает нормально... так что случай происходит только при первом касании после загрузки URL-адреса.   -  person Marcin Jancewicz    schedule 02.01.2012
comment
@Marcin, это было давно, и я не могу вспомнить, как я решил это. Хотя я считаю, что это было чертовски некрасиво. Что-то вроде: когда стиль изменится, установите функцию для запуска через 100 мс, которая устанавливает для div, обертывающего всю страницу, случайное нижнее заполнение. Это вызвало ретрансляцию. Могу ошибаться, так как это выбито из памяти. Я не могу проверить это прямо сейчас, но если я вернусь к этому, я когда-нибудь вернусь и добавлю ответ о том, что я в итоге сделал!   -  person cottonBallPaws    schedule 03.01.2012
comment
Я согласен, что это довольно уродливо, но... это действительно работает :-) Спасибо!   -  person Marcin Jancewicz    schedule 03.01.2012
comment
Та же проблема здесь - после добавления внутри JS-функции мне нужно нажать на элемент, чтобы сделать его видимым - есть ли какие-либо новости или надежный обходной путь?   -  person Jook    schedule 08.07.2013


Ответы (1)


Вероятно, это проблема с кэшированием, у меня была такая же проблема, и я исправил ее, добавив это в настройку веб-просмотра:

webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
webview.getSettings().setAppCacheEnabled(false);
person Chenchik    schedule 10.06.2016