WebView «мигает» на белом фоне, если включено аппаратное ускорение (Android 3.0+) - PullRequest
42 голосов
/ 28 февраля 2012

У меня проблема с 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: проблема не появится, если аппаратное ускорение выключено. У кого-нибудь была такая же проблема и она решена?

Спасибо.

Ответы [ 6 ]

45 голосов
/ 25 апреля 2013

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

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));
}
12 голосов
/ 19 июня 2012

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

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

Привет Торстен

8 голосов
/ 31 марта 2015

Была эта проблема на 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));

4 голосов
/ 10 сентября 2012

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

0 голосов
/ 06 июня 2018

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

WebView web=(WebView)findViewById(R.id.web);
web.setBackgroundColor(0xff000000);
0 голосов
/ 05 октября 2012

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

...