Arrière-plan de style WebView Android-Couleur: transparent ignoré sur android 2.2
j'ai du mal à créer un WebView avec un fond transparent.
webView.setBackgroundColor(0x00FFFFFF);
webView.setBackgroundDrawable(myDrawable);
puis je charge une page html avec
<body style="background-color:transparent;" ...
la couleur de fond du WebView est transparente mais dès que la page est chargée, elle est écrasée par un fond noir de la page html. Cela ne se produit que sur android 2.2, il fonctionne sur android 2.1.
donc il y a quelque chose à ajouter dans le code de la page html pour le faire vraiment transparent ?
19 réponses
ça a marché pour moi,
mWebView.setBackgroundColor(Color.TRANSPARENT);
En bas de cette question il y a une solution. C'est une combinaison de 2 solutions.
webView.setBackgroundColor(Color.TRANSPARENT);
webView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
en ajoutant ce code au WebViewer après en chargeant l'url, cela fonctionne (API 11+).
il fonctionne même quand l'accélération hardeware est sur
j'ai eu le même problème avec 2.2 et aussi dans 2.3. J'ai résolu le problème en donnant l'alpa valeur html pas dans android. J'ai essayé beaucoup de choses et ce que j'ai découvert est setBackgroundColor();
couleur ne fonctionne pas avec la valeur alpha. webView.setBackgroundColor(Color.argb(128, 0, 0, 0));
ne marchera pas.
alors voici ma solution, ça a marché pour moi.
String webData = StringHelper.addSlashes("<!DOCTYPE html><head> <meta http-equiv=\"Content-Type\" " +
"content=\"text/html; charset=utf-8\"> </head><body><div style=\"background-color: rgba(10,10,10,0.5); " +
"padding: 20px; height: 260px; border-radius: 8px;\"> $$$ Content Goes Here ! $$$ </div> </body></html>");
et en Java,
webView = (WebView) findViewById(R.id.webview);
webView.setBackgroundColor(0);
webView.loadData(webData, "text/html", "UTF-8");
et voici la capture d'écran de sortie ci-dessous.
en fait, c'est un bug et personne n'a trouvé de solution pour l'instant. Un problème a été créé. L'insecte est toujours ici dans le nid d'abeille.
s'il vous plaît, commencez si vous pensez que c'est important: http://code.google.com/p/android/issues/detail?id=14749
C'est comment vous le faites:
faites D'abord votre base de projet sur 11, mais dans AndroidManifest mettez minSdkVersion à 8
android: hardwareAccelerated= "false" est inutile, et il est incompatible avec 8
wv.setBackgroundColor(0x00000000);
if (Build.VERSION.SDK_INT >= 11) wv.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
this.wv.setWebViewClient(new WebViewClient()
{
@Override
public void onPageFinished(WebView view, String url)
{
wv.setBackgroundColor(0x00000000);
if (Build.VERSION.SDK_INT >= 11) wv.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
}
});
pour la sécurité mettez ceci dans votre style:
BODY, HTML {background: transparent}
a travaillé pour moi sur 2.2 et 4
la chose La plus importante n'a pas été mentionné.
le code html doit avoir une étiquette body
avec background-color
fixée à transparent
.
ainsi la solution complète serait:
HTML
<body style="display: flex; background-color:transparent">some content</body>
activité
WebView wv = (WebView) findViewById(R.id.webView);
wv.setBackgroundColor(0);
wv.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
wv.loadUrl("file:///android_asset/myview.html");
ci-dessous le code fonctionne très bien Android 3.0+ mais quand vous essayez ce code sous android 3.0 puis votre application fermée de force.
webView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
vous essayez le code ci-dessous sur votre moins API 11 .
webview.setBackgroundColor(Color.parseColor("#919191"));
ou
vous pouvez également essayer ci-dessous le code qui fonctionne sur tous API amende.
webview.setBackgroundColor(Color.parseColor("#919191"));
if (Build.VERSION.SDK_INT >= 11) {
webview.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
}
ci-dessus code d'utilisation complet pour moi.
suit le travail de code pour moi, bien que j'ai plusieurs webviews et défiler entre eux est un peu léthargique.
v.setBackgroundColor(Color.TRANSPARENT);
Paint p = new Paint();
v.setLayerType(LAYER_TYPE_SOFTWARE, p);
utiliser cette
WebView myWebView = (WebView) findViewById(R.id.my_web);
myWebView.setBackgroundColor(0);
- après avoir essayé tout ce qui est indiqué ci-dessus. J'ai trouvé que cela n'a pas d'importance que vous spécifiiez
webView.setBackgroundColor(Color.TRANSPARENT)
avant ou aprèsloadUrl()
/loadData()
. - la chose qui importe est que vous devriez déclarer explicitement
android:hardwareAccelerated="false"
dans le manifeste.
testé sur Sandwich à la crème glacée
utilisez ces lignes .....
webView.loadDataWithBaseURL(null,"Hello", "text/html", "utf-8", null);
webView.setBackgroundColor(0x00000000);
et rappelez-vous un point que définit toujours la couleur de fond après avoir chargé des données dans webview.
si webview est contrôlable:
-
ajouter ceci au Manifeste:
android:hardwareAccelerated="false"
ou
-
ajouter ce qui suit à WebView dans la mise en page:
android:background="@android:color/transparent" android:layerType="software"
-
ajouter ce qui suit à la vue parents scroll:
android:layerType="software"
webView.setBackgroundColor(0x00000000);
webView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
ça va marcher.. définissez background en XML avec Editbackground. Maintenant que le fond sera affiché
définit le bg après avoir chargé le html(à partir de tests rapides, il semble charger le html réinitialise la couleur du bg.. c'est pour 2.3).
si vous chargez le html à partir de données que vous avez déjà, il suffit de faire un .postDelayed dans lequel vous venez de définir le bg(à transparent par exemple) est suffisant..
essayez webView.setBackgroundColor (couleur.parseColor ("#EDEDED"));
j'essayais de mettre une superposition HTML transparente au-dessus de ma vue GL mais elle a toujours clignotement noir qui couvre ma vue GL. Après plusieurs jours à essayer de se débarrasser de ce scintillement j'ai trouvé cette solution qui est acceptable pour moi (mais une honte pour android).
le problème est que j'ai besoin d'une accélération matérielle pour mes belles animations CSS et donc webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
n'est pas une option pour moi.
le truc était de mettre un second (vide) WebView
entre ma vue GL et la superposition HTML. Ce dummyWebView
j'ai dit de rendre en mode SW, et maintenant mes overlays HTML rend lisse en HW et plus de scintillement noir.
Je ne sais pas si cela fonctionne sur d'autres appareils que mon Acer Iconia A700, mais j'espère que je pourrais aider quelqu'un avec cela.
public class MyActivity extends Activity {
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
RelativeLayout layout = new RelativeLayout(getApplication());
setContentView(layout);
MyGlView glView = new MyGlView(this);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
dummyWebView = new WebView(this);
dummyWebView.setLayoutParams(params);
dummyWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
dummyWebView.loadData("", "text/plain", "utf8");
dummyWebView.setBackgroundColor(0x00000000);
webView = new WebView(this);
webView.setLayoutParams(params);
webView.loadUrl("http://10.0.21.254:5984/ui/index.html");
webView.setBackgroundColor(0x00000000);
layout.addView(glView);
layout.addView(dummyWebView);
layout.addView(webView);
}
}
ça a marché pour moi. essayez de définir la couleur de fond une fois les données chargées. pour ce setWebViewClient sur votre objet webview comme:
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url)
{
super.onPageFinished(view, url);
webView.setBackgroundColor(Color.BLACK);
}
});