web-dev-qa-db-fra.com

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

J'ai un problème avec WebView (Android 3.0+), pour lequel WebView 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 résoudre ce problème, mais pas de chance.

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

Je vous remercie.

41
Tri Bui

J'ai trouvé le correctif le plus efficace pour cela, la première fois que nous mentionnons ici , était de définir une couleur d'arrière-plan transparente une fois la mise en page gonflée:

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

Oui, c'est un piratage 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 fonctionne pas par le biais de la définition de l’arrière-plan XML.

Ce problème a été résolu dans Jellybean, bien que certains utilisateurs l'aient signalé dans KitKat. Vérifiez que vous avez pas l'accélération matérielle désactivée, et si le problème disparaît effectivement, vous voudrez probablement envelopper le code dans une instruction conditionnelle pour ne cibler que les anciens périphériques:

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

J'ai activé l'accélération matérielle pour l'application et je l'ai désactivée pour l'activité. De plus, je règle l'arrière-plan sur null, comme mentionné ci-dessus. Ça marche pour moi maintenant.

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

Greetz Thorsten

12
user640688

Avait ce problème sur Android 4.4.4 et aucune des autres solutions ici n'a fonctionné. De toute façon, je m'amusais avec onPageFinished(), alors autant essayer quelque chose qui devrait être à l'épreuve des balles:

Je mets ceci dans la onCreateView() du fragment qui héberge la 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 masquer la WebView jusqu'au chargement de la première page. Cependant, cela m'a quand même donné un petit éclair de blanc jusqu'à ce que j'ajoute également la solution fournie par Paul Lammertsma, webView.setBackgroundColor(Color.argb(1, 0, 0, 0));

8
Magnus W

C'est évidemment une "fonctionnalité" affreuse de la version Android> 3. Même l'application officielle Google Reader contient ce flash blanc. La solution consiste à désactiver l'accélération matérielle pour l'activité, où vous devez utiliser l'affichage rapide des dessins Web. 

4
Jan Muller

Si le même problème avec la vue Web ... J'ai travaillé sur Sandwich Sandwich et mettre minSdk = 13 dans le manifeste Android a fonctionné pour moi .. Essayez de faire des expériences avec cela. Je suppose qu'il y a un bug dans le SDK.

0
Veljko

Allez comme ça:

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