Подтвердить что ты не робот

Проблема с перерисованием WebView при загрузке данных

Я сталкиваюсь с проблемой отображения с веб-просмотром, который я использую в одном из моих приложений.

Когда я вызываю loadData, веб-просмотр сначала отображает текст, а затем загружает изображения страницы (стандартное поведение).

Иногда, если эти изображения изменяют положение текста, старая позиция текста не очищается, и отображается как старый текст, так и новый текст + изображение.

Вот скриншот того, как он выглядит, когда возникает проблема:

webview redraw problem

Это похоже на веб-просмотр, который не перерисовывает правильно содержимое. Конечно, простой invalidate() не работает...

Это происходит не часто, но позволяет говорить один раз за 20.

Код, используемый для отображения данных (называемых внешними методами жизненного цикла):

// Include the html headers to the content received from WS
String webtext = String.format(ConfigApp.HTML_BODY, wsdata.getText());
mWebView.setWebChromeClient(...);
mWebView.setWebViewClient(...);
mWebView.setBackgroundColor(0);
mWebView.loadDataWithBaseURL(null, webtext, "text/html", "UTF-8", null);

Любая идея, как это исправить?

4b9b3361

Ответ 1

Наконец-то я нашел способ устранить проблему.

Удалите прозрачный фон WebView:

String webtext = String.format(ConfigApp.HTML_BODY, wsdata.getText());
mWebView.setWebChromeClient(...);
mWebView.setWebViewClient(...);
// mWebView.setBackgroundColor(0);
mWebView.loadDataWithBaseURL(null, webtext, "text/html", "UTF-8", null);

Потому что мой WebView имеет пустой фон, это нормально для меня. Может быть, это может раздражать кого-то другого.

Конечно, это ошибка WebView.

Ответ 2

Если вы установите WebView на определенный размер, а не "wrap_content", то после загрузки данных веб-просмотр не будет правильно изменять его содержимое.

Я думаю, что это ошибка с виджетами.

Итак..
Попробуйте использовать "wrap_content" в атрибуте layout_height.

Ответ 3

У меня часто возникали спорадические проблемы, когда WebView не отображались правильно после загрузки содержимого с помощью loadDataWithBaseUrl. Хотя для высоты WebView было установлено значение wrap_content, WebView не всегда будет изменять размер, чтобы обернуть содержимое. Вместо этого веб-просмотр имел высоту нуля. Иногда это проявлялось бы хорошо, а иногда - нет. Иногда проблема может возникнуть только в портретной ориентации, и пейзаж будет работать нормально. Я попытался удалить мой вызов setBackgroundColor, но это не помогло. Тем не менее, мне удалось решить эту проблему, изменив макет, который был у WebView, от LinearLayout до RelativeLayout.

Ответ 4

Try

mWebView.setBackgroundColor(0x00ff0000);

Ответ 5

Вам просто нужно вызвать метод refreshDrawableState() после вызова метода loadDataWithBaseURL() и его решит вашу проблему.

mWebView.loadDataWithBaseURL(null, webtext, "text/html", "UTF-8", null);
mWebView.refreshDrawableState();