46 votes

WebView "clignotant" avec un fond blanc si l'accélération matérielle est activée (Android 3.0+)

J'ai un problème avec le WebView (Android 3.0+), qui affiche toujours un fond blanc avant d'afficher mon fond noir ("clignotant"). Voici mon code de test simple :

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

J'ai essayé de nombreuses solutions pour me débarrasser de ce problème, mais sans succès.

PS : Le problème n'apparaît pas si l'accélération matérielle est désactivée. Quelqu'un a-t-il rencontré le même problème et l'a-t-il résolu ?

Merci.

0 votes

J'ai le même problème, pouvez-vous trouver une solution à ce sujet ?

2 votes

Nous n'avons toujours pas de solution ou de solution de rechange. Le problème est signalé ici : code.google.com/p/Android/issues/detail?id=26138 et ici code.google.com/p/Android/issues/detail?id=25722

0 votes

J'ai résolu mon problème, webView.setBackgroundColor(0) ; l'avez-vous essayé ?

0voto

BlackJerry Points 43

Nous sommes en 2021 et je me suis encore débattue avec ce problème et je voudrais partager mon expérience. Aucune des solutions que j'ai trouvées n'a fonctionné. Je ne peux pas désactiver l'accélération matérielle pour webview car cela entraînerait une baisse trop importante des performances. Après avoir essayé un tas de solutions, j'ai réalisé qu'il n'est pas possible de changer la visibilité de webview de View.INVISIBLE à View.VISIBLE sans causer de scintillement/clignotement/clignotement. J'ai donc laissé le webview visible. Cependant, j'ai réglé la translucidité du webview sur tranparent dans le fichier layout. Pendant le chargement d'une url, le webview est transparent. Une fois la page chargée, je règle le webview sur opaque pour montrer le webview à l'écran. Puisqu'il n'y a pas de changement de visibilité du webview, il n'y a pas de problème de scintillement/clignotement/clignotement.

Le fichier de mise en page :

    <WebView
        android:id="@+id/WebView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"
        android:alpha="0.0"
        android:background="@android:color/transparent"
    />

MainActivity.kt :

    mWebView.webViewClient = object : WebViewClient() {
        override fun onPageFinished(view: WebView?, url: String?) {
            super.onPageFinished(view, url)

            // code for other stuff

            // Change the webview translucency from transparent to opaque.
            // This is a workaround of the Android bug of webview blinking when hardware acceleration is turned on
            // Basically, we cannot change the webview visibility to show and hide the webview.
            // Doing so would cause flickering/blinking with hardware acceleration).
            // Instead, the webview is visible the entire time.
            // We set the webview to be transparent while loading a page and then change the webview
            // to opaque once the page is loaded to make the webview visible to the user.
            if (mWebView.alpha < 1.0F) {
                mWebView.alpha = 1.0F
            }

            // more code for other stuff
        }
    }

0voto

Veljko Points 554

J'ai eu le même problème avec la vue web. J'ai travaillé sur Ice Cream Sandwich et mettre minSdk = 13 dans Android Manifest a fonctionné pour moi. Essayez d'expérimenter avec cela. Je suppose qu'il y a un bug dans le SDK.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X