WebView мигает белым фоном, если включено аппаратное ускорение (Android 3.0+)

У меня проблема с WebView (Android 3.0+), когда WebView всегда отображает белый фон перед отображением моего черного фона ("мигает"). Вот мой простой тестовый код:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    WebView webView = new WebView(this);
    webView.setBackgroundColor(Color.BLACK);
    setContentView(webView);
    loadWebView(webView);
    webView.loadDataWithBaseURL("localhost://", "<html><head>" +
            "<style>body {background-color: #000}img{max-width:100%}</style></head>" +
            "<body>" +
            "<img src=\"http://developer.android.com/images/practices/actionbar-phone-splitaction.png\" />" +
            "</body></html>", 
            "text/html", "UTF-8", null);
}

Я пробовал много решений, чтобы избавиться от этой проблемы, но не повезло.

PS: Проблема не появится, если отключить аппаратное ускорение. У кого-нибудь есть такая же проблема и решить ее?

Спасибо.


comment
у меня такая же проблема, не могли бы вы найти решение по этому поводу?   -  person bahadir arslan    schedule 30.03.2012
comment
У нас до сих пор нет решения/обходного пути. Об этом сообщается здесь: code.google.com/p/android/issues. /detail?id=26138 и здесь code.google. com/p/android/issues/detail?id=25722   -  person Tri Bui    schedule 04.04.2012
comment
я решил свою проблему, webView.setBackgroundColor(0); ты пробовал это?   -  person bahadir arslan    schedule 04.04.2012
comment
Я пытался, но это не работает.   -  person Tri Bui    schedule 11.04.2012
comment
Только сегодня наткнулся на это. По какой-то причине отключения аппаратного ускорения для рассматриваемых действий недостаточно. Вам нужно отключить его для всего приложения.   -  person    schedule 20.04.2012
comment
К вашему сведению: эта ошибка исправлена ​​в Jelly Bean.   -  person Tri Bui    schedule 09.08.2012
comment
Я нашел хакерский обходной путь, см. мой пост: stackoverflow.com/a/17485236/923097   -  person Ingemar    schedule 05.07.2013
comment
Это звучит немного похоже на проблему, с которой я столкнулся некоторое время назад. Вы можете проверить мой SO-вопрос/ответ здесь: stackoverflow.com/questions/13500452/   -  person Kyle    schedule 08.07.2013
comment
@Ingemar Ваше решение — отключить аппаратное ускорение, что негативно скажется на производительности и энергопотреблении.   -  person Paul Lammertsma    schedule 02.10.2013
comment
@Kyle Ваше решение состоит в том, чтобы постоянно вызывать invalidate(), что будет иметь катастрофические последствия для энергопотребления.   -  person Paul Lammertsma    schedule 02.10.2013
comment
Эта проблема не уникальна для эмулятора, и она также не исправлена ​​в Jelly Bean (или впоследствии снова сломалась).   -  person Nate    schedule 25.02.2015


Ответы (6)


Я обнаружил, что наиболее эффективное решение этой проблемы, впервые упомянутое здесь, заключалось в установке прозрачный цвет фона после увеличения макета:

webView.setBackgroundColor(Color.argb(1, 0, 0, 0));

Да, это полный хак, но это единственное решение, которое я нашел хорошо работающим без отключения аппаратного ускорения.

Обратите внимание, что это не работает при настройке фона в XML.

Это было решено в Jellybean, хотя некоторые пользователи сообщали, что видели это в KitKat. Убедитесь, что вы не отключили аппаратное ускорение, и, если проблема действительно исчезнет, ​​вы, вероятно, захотите обернуть этот код в условный оператор только для старых устройств:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
    webView.setBackgroundColor(Color.argb(1, 0, 0, 0));
}
person Paul Lammertsma    schedule 25.04.2013
comment
Я звонил webView.setBackgroundColor(Color.TRANSPARENT); но это не сработало. Однако больше не мерцает при использовании Color.argb(1,0,0,0) - person John Weidner; 01.05.2013
comment
Я пробовал это, но не работал. Это только уменьшило белую вспышку до сероватой вспышки. - person DanKodi; 09.05.2013
comment
Работает, но на Android 2.3 он заполняет весь веб-просмотр сплошным черным цветом. Поэтому нам нужна дополнительная логика ветвления, чтобы сделать ее универсальной. - person Display Name; 13.11.2013
comment
@PaulLammertsma, я вижу эту проблему в kitkat, поэтому обертывание кода и проверка до jellybean неправильно ... - person Lena Bru; 25.06.2014
comment
Всем привет. это исправление работало для меня в 4.4.4 (Nexus 5). Я также страдал от этой проблемы мерцания в веб-представлении в 4.4.4. - person Sotti; 20.07.2014
comment
Я могу подтвердить, что на Lollypop все еще есть проблема со стандартным WebView (я использую плагин UniWebView для Unity3D), но это решает проблему. - person Sean Dawson; 10.12.2014
comment
Работает как шарм в Lollipop, также установите контейнер в черный цвет, и все готово! - person visionix visionix; 03.07.2016
comment
7 лет спустя у меня все еще есть та же проблема внутри WebView, где использование setLayerType(HARDWARE,...) с kotlin вызывает белую вспышку. к сожалению, ни одно из решений в этой теме пока не сработало. - person cyfrost; 28.06.2020
comment
Эта проблема по-прежнему наблюдается в API 25, и, к сожалению, приведенное здесь решение не помогает ее решить. - person PGMacDesign; 01.08.2020

Я включил аппаратное ускорение для приложения и отключил его для активности. Кроме того, я установил фон на null, как упоминалось выше. Теперь это работает для меня.

Другой подход (непроверенный): установите тип слоя на программную визуализацию и установите фон на Color.TRANSPARENT (или 0): webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

Гретц Торстен

person user640688    schedule 19.06.2012
comment
LAYER_TYPE_SOFTWARE не объявлен, выдает исключение - person Yunus Eren Güzel; 15.08.2012
comment
developer.android.com/reference/android/view/ - person user640688; 27.08.2012
comment
webview.setLayerType(View.LAYER_TYPE_SOFTWARE, ноль); это API 11 - person Jared Burrows; 20.05.2013
comment
Просто потепление, установка нулевого типа слоя отключит аппаратное ускорение и, следовательно, воспроизведение видео в WebView! Мне потребовались часы, чтобы понять, почему видео не воспроизводятся. - person Quinxy von Besiex; 09.08.2014

Была эта проблема на Android 4.4.4, и ни одно из других решений здесь не сработало. Я все равно возился с onPageFinished(), так что мог бы попробовать что-нибудь, что должно быть пуленепробиваемым:

Я поместил это в onCreateView() фрагмента, в котором размещен WebView:

    webView = (WebView) v.findViewById(R.id.webView);
    webView.setVisibility(View.INVISIBLE);
    webView.setBackgroundColor(Color.argb(1, 0, 0, 0));         

    webView.setWebViewClient( new WebViewClient(){
        @Override
        public void onPageFinished(WebView view, String url) {
            view.setVisibility(View.VISIBLE);
            super.onPageFinished(view, url);
        }
    });

Идея состоит в том, чтобы просто скрыть WebView до тех пор, пока не загрузится первая страница. Тем не менее, он по-прежнему давал мне небольшую вспышку белого, пока я не добавил решение, предоставленное Полом Ламмертсма, webView.setBackgroundColor(Color.argb(1, 0, 0, 0));

person Magnus W    schedule 30.03.2015
comment
Спасибо! Однако у меня есть одна проблема: содержимое веб-просмотра теперь невидимо (очевидно), пока оно полностью не завершит загрузку. Если в моем контенте много изображений, загрузка которых занимает некоторое время, все содержимое будет невидимым, пока загружаются все изображения. Я хочу, чтобы контент отображался сразу, пока изображения загружаются, так как веб-просмотр будет хорошо отображать остальную часть содержимого и добавлять изображения по завершении. Но это не работает с этим подходом, потому что мы его скрываем. Любая идея исправить это? Вместо этого я попытался сделать его видимым в onPageStarted, но это возвращает белую вспышку :( - person Nick Thissen; 16.05.2015
comment
Не уверен, как это можно сделать, поскольку я загружал локальный HTML-файл из папки с ресурсами, у меня не было этой проблемы. Может быть, вы могли бы попробовать какое-то перенаправление? (т.е. загрузка одной страницы, которая, в свою очередь, перенаправляет на другую страницу) - person Magnus W; 17.05.2015

Это явно ужасная «фича» Android версии >3. Даже официальное приложение Google Reader содержит эту белую вспышку. Решение состоит в том, чтобы отключить ускорение HW для действия, где вам нужно использовать веб-представление быстрого рисования.

person Jan Muller    schedule 10.09.2012

Просто иди так:

WebView web=(WebView)findViewById(R.id.web);
web.setBackgroundColor(0xff000000);
person PYK    schedule 06.06.2018

Была аналогичная проблема с веб-просмотром. Я работал над Ice Cream Sandwich, и установка minSdk = 13 в манифесте Android сработала для меня. Попробуйте поэкспериментировать с этим. Я предполагаю, что в SDK есть какая-то ошибка.

person Veljko    schedule 05.10.2012