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