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

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

Спасибо.

4b9b3361

Ответ 1

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

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));
}

Ответ 2

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

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

Greetz Thorsten

Ответ 3

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

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

Ответ 5

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