如果启用了硬件加速,WebView将以"白色背景闪烁"(Android 3.0+)

Tri*_*Bui 42 android webview hardware-acceleration android-3.0-honeycomb android-4.0-ice-cream-sandwich

我有一个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);
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试了很多解决方案来摆脱这个问题,但并不幸运.

PS:如果关闭硬件加速,则不会出现此问题.有人有同样的问题并解决了吗?

谢谢.

Pau*_*sma 45

我发现这里首先提到的最有效的解决方法是在布局膨胀后设置透明背景颜色:

webView.setBackgroundColor(Color.argb(1, 0, 0, 0));
Run Code Online (Sandbox Code Playgroud)

是的,这是一个完全黑客攻击,但它是我发现在没有禁用硬件加速的情况下工作良好的唯一解决方案.

请注意,这并不会通过设置在XML后台工作.

这已在Jellybean中得到解决,尽管一些用户报告在KitKat中看到了这一点.检查您是否禁用硬件加速,如果问题确实消失,您可能希望将该代码包装在条件语句中以仅定位旧设备:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
    webView.setBackgroundColor(Color.argb(1, 0, 0, 0));
}
Run Code Online (Sandbox Code Playgroud)

  • 我正在调用webView.setBackgroundColor(Color.TRANSPARENT); 但那没用.但是,使用Color.argb(1,0,0,0)时不再闪烁 (4认同)
  • 嗨,您好.这个修复在4.4.4(Nexus 5)中适用于我.我在4.4.4中也在Web视图中遇到了这个闪烁的问题. (3认同)
  • 7 年后,我在 WebView 中仍然遇到同样的问题,其中将 setLayerType(HARDWARE,...) 与 kotlin 一起使用会导致白色闪烁。不幸的是,到目前为止,该线程中的所有解决方案都不起作用。 (3认同)
  • 我可以确认使用标准WebView在Lollypop上仍然存在问题(我正在将Unity3D使用UniWebView插件),但这确实可以解决问题。 (2认同)

use*_*688 12

我已为应用程序启用了硬件加速,并为活动禁用了它.另外,我将背景设置为null,如上所述.它现在对我有用.

另一种方法(未经测试):将图层类型设置为软件渲染并将背景设置为Color.TRANSPARENT(或0):webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

格雷茨托斯滕


Mag*_*s W 8

在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);
        }
    });
Run Code Online (Sandbox Code Playgroud)

这个想法只是隐藏WebView,直到第一页加载完毕.然而,在我添加Paul Lammertsma提供的解决方案之前,它仍然给了我一小段白色,webView.setBackgroundColor(Color.argb(1, 0, 0, 0));


Jan*_*ler 5

这显然是Android版本> 3的可怕“功能”。甚至官方应用程序谷歌阅读器也包含这个白色闪光。解决方案是禁用活动的硬件加速,您需要使用快速绘制网络视图。