WebView "flashing" with white background if hardware acceleration is enabled (Android 3.0+)

Tri Bui picture Tri Bui · Feb 28, 2012 · Viewed 25.7k times · Source

I have an issue with the WebView (Android 3.0+), which the WebView always displays a white background before display my black background ("flashing"). Here is my simple test code:

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

I have tried many solutions to get rid of this problem, but not lucky.

PS: The problem will not appear if the hardware acceleration is turned off. Have anybody have the same problem and solved it?

Thank you.

Answer

Paul Lammertsma picture Paul Lammertsma · Apr 25, 2013

I found the most effective fix for this, first mentioned here, was to set a transparent background color after the layout has been inflated:

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

Yes, it's a total hack, but it's the only solution I've found to work well without disabling hardware acceleration.

Note that this does not work through setting the background in XML.

This has been resolved in Jellybean, although some users have reported seeing this in KitKat. Check that you have not disabled hardware acceleration, and if the problem indeed disappears, you will probably want to wrap that code in a conditional statement to only target older devices:

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