it-swarm.com.ru

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

Спасибо.

41
Tri Bui

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

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

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

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

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

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
    webView.setBackgroundColor(Color.argb(1, 0, 0, 0));
}
45
Paul Lammertsma

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

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

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

12
user640688

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

8
Magnus W

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

4
Jan Muller

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

0
Veljko

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

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