wake-up-neo.net

WebView blinkt mit weißem Hintergrund, wenn die Hardwarebeschleunigung aktiviert ist (Android 3.0 und höher)

Ich habe ein Problem mit dem WebView (Android 3.0+), bei dem das WebView immer einen weißen Hintergrund anzeigt, bevor mein schwarzer Hintergrund angezeigt wird ("Blinken"). Hier ist mein einfacher Testcode:

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

Ich habe viele Lösungen ausprobiert, um dieses Problem zu lösen, aber kein Glück.

PS: Das Problem wird nicht angezeigt, wenn die Hardwarebeschleunigung deaktiviert ist. Hat jemand das gleiche Problem und hat es gelöst?

Vielen Dank.

41
Tri Bui

Ich fand die effektivste Lösung dafür, hier zuerst erwähnt , eine transparente Hintergrundfarbe festzulegen, nachdem das Layout aufgeblasen wurde:

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

Ja, es ist ein totaler Hack, aber es ist die einzige Lösung, die ich für gut befunden habe, ohne die Hardwarebeschleunigung zu deaktivieren.

Beachten Sie, dass dies nicht ​​das Festlegen des Hintergrunds in XML bewirkt.

Dies wurde in Jellybean behoben, obwohl einige Benutzer berichtet haben, dies in KitKat zu sehen. Vergewissern Sie sich, dass Sie die Hardwarebeschleunigung nicht deaktiviert haben, und wenn das Problem tatsächlich verschwindet, möchten Sie diesen Code wahrscheinlich in eine bedingte Anweisung einschließen, um nur ältere Geräte als Ziel zu verwenden:

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

Ich habe die Hardwarebeschleunigung für die Anwendung aktiviert und für die Aktivität deaktiviert. Zusätzlich habe ich den Hintergrund auf null gesetzt, wie oben erwähnt. Es funktioniert jetzt für mich.

Ein anderer Ansatz (ungetestet): Legen Sie den Layer-Typ auf Software-Rendering und den Hintergrund auf Color.TRANSPARENT (oder 0) fest: webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

Greetz Thorsten

12
user640688

Hatte dieses Problem auf Android 4.4.4 und keine der anderen Lösungen funktionierte hier. Ich habe sowieso mit onPageFinished() herumgespielt, also könnte man auch etwas versuchen, was kugelsicher sein sollte:

Ich füge dies in onCreateView() des Fragments ein, das die WebView hostet:

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

Die Idee ist einfach, das WebView auszublenden, bis die erste Seite geladen wurde. Es gab mir jedoch immer noch ein kleines weißes Aufblitzen, bis ich auch die von Paul Lammertsma bereitgestellte Lösung hinzufügte: webView.setBackgroundColor(Color.argb(1, 0, 0, 0));

8
Magnus W

Es ist offensichtlich ein schreckliches "Feature" der Android-Version> 3. Auch die offizielle App Google Reader enthält diesen weißen Blitz. Die Lösung besteht darin, die HW-Beschleunigung für die Aktivität zu deaktivieren, bei der Sie eine schnelle Webansicht verwenden müssen. 

4
Jan Muller

Hatte das ähnliche Problem mit der Web-Ansicht ... Ich habe an Eis-Sandwich gearbeitet und minSdk = 13 in Android Manifest gesetzt. Ich vermute, es gibt einen Fehler in SDK.

0
Veljko

Gehen Sie einfach so vor:

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