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é ?

52voto

Paul Lammertsma Points 12817

J'ai trouvé la solution la plus efficace à ce problème, mentionné pour la première fois ici Le but de l'opération était de définir une couleur d'arrière-plan transparente après que la mise en page ait été gonflée :

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

Oui, c'est un hack total, mais c'est la seule solution que j'ai trouvée qui fonctionne bien sans désactiver l'accélération matérielle.

Notez que cela ne no travailler à la mise en place de l'arrière-plan en XML.

Ce problème a été résolu dans Jellybean, mais certains utilisateurs ont signalé qu'il se produisait dans KitKat. Vérifiez que vous avez no désactivé l'accélération matérielle, et si le problème disparaît effectivement, vous voudrez probablement envelopper ce code dans une déclaration conditionnelle pour ne cibler que les anciens appareils :

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

4 votes

J'ai appelé webView.setBackgroundColor( Color.TRANSPARENT ) ; mais cela n'a pas fonctionné. Cependant, il n'y a plus de scintillement lorsque j'utilise Color.argb(1,0,0,0).

0 votes

J'ai essayé ceci mais ça n'a pas marché. Cela a seulement réduit le flash blanc à un flash grisâtre.

0 votes

Cela fonctionne, mais sous Android 2.3, toute la vue web est remplie de noir uni. Nous avons donc besoin d'une logique de branchement supplémentaire pour le rendre universel.

13voto

user640688 Points 276

J'ai activé l'accélération matérielle pour l'application et je l'ai désactivée pour l'activité. De plus, j'ai réglé l'arrière-plan sur null comme indiqué ci-dessus. Cela fonctionne pour moi maintenant.

Une autre approche (non testée) : définissez le type de couche sur le rendu logiciel et définissez l'arrière-plan à Color.TRANSPARENT (ou 0 ) : webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

Greetz Thorsten

0 votes

LAYER_TYPE_SOFTWARE n'est pas déclaré, ce qui entraîne une exception.

0 votes

0 votes

Webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null) ; is API 11

9voto

BadCash Points 566

J'ai eu ce problème sur Android 4.4.4 et aucune des autres solutions ici n'a fonctionné. Je me suis amusé avec onPageFinished() de toute façon, alors autant essayer quelque chose qui devrait être à l'épreuve des balles :

J'ai mis ça dans le onCreateView() du fragment qui héberge le 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);
        }
    });

L'idée est simplement de cacher le WebView jusqu'à ce que la première page soit chargée. Cependant, cela me donnait toujours un petit flash blanc jusqu'à ce que j'ajoute également la solution fournie par Paul Lammertsma, webView.setBackgroundColor(Color.argb(1, 0, 0, 0));

0 votes

Merci de votre attention ! J'ai cependant un problème : le contenu de la webview est maintenant invisible (évidemment) jusqu'à ce que le chargement soit complètement terminé. Si mon contenu contient beaucoup d'images qui prennent du temps à charger, tout le contenu est invisible pendant que toutes les images se chargent. Je veux que le contenu s'affiche immédiatement, pendant que les images se chargent, car la webview affichera gentiment le reste du contenu et ajoutera les images une fois le chargement terminé. Mais cela ne fonctionne pas avec cette approche car nous le cachons. Une idée pour résoudre ce problème ? J'ai essayé de le rendre visible dans onPageStarted à la place mais cela ramène le flash blanc :(

1 votes

Je ne sais pas trop comment cela peut se faire, puisque je chargeais un fichier HTML local à partir du dossier assets, je n'avais pas ce problème. Peut-être pourriez-vous essayer une sorte de redirection ? (c'est-à-dire charger une page, qui à son tour redirige vers une autre page).

5voto

Jan Muller Points 126

Il s'agit manifestement d'une "fonctionnalité" horrible de la version Android >3. Même l'application officielle Google Reader contient ce flash blanc. La solution est de désactiver l'accélération HW pour l'activité où vous devez utiliser la vue web à dessin rapide.

1voto

PYK Points 1225

Fais comme ça :

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

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