Android WebView stili arka plan rengi: şeffaf Android 2.2'de yok sayıldı


158

Saydam arka plana sahip bir WebView oluşturmak için uğraşıyorum.

webView.setBackgroundColor(0x00FFFFFF);
webView.setBackgroundDrawable(myDrawable);

Sonra bir html sayfası yüklüyorum

<body style="background-color:transparent;" ...

WebView'ın arka plan rengi saydamdır, ancak sayfa yüklenir yüklenmez html sayfasındaki siyah bir arka plan üzerine yazılır. Bu sadece android 2.2'de olur, android 2.1 üzerinde çalışır.

Gerçekten şeffaf hale getirmek için html sayfa koduna eklemek için bir şey var mı?


1
Üzgünüm, ama benim sorunum için burada listelenen hiçbir çözüm işe yaramadı ...: = (yine de thx .. web sayfası her zaman beyaz bir arka plan kullanıyordu ...
cV2

Yanıtlar:


293

Bu benim için çalıştı,

mWebView.setBackgroundColor(Color.TRANSPARENT);

1
OS 2.2 üzerinde gerçekten test yaptınız mı?
jptsetung

87
Bu url veya veri yüklendikten SONRA çağırılması gerektiğini buldum .
Mark

11
kullanıyorsanız android 3.x çalışmıyorandroid:hardwareAccelerated="true"
Macarse

2
ICS'de (4.0.3), yukarıdaki yorumlara ek olarak; API düzey 10 ile çalışacak şeffaflık elde etmek için "Ayarlar -> Geliştirici Seçenekleri -> GPU Oluşturmaya Zorla" seçeneğini devre dışı bırakmak zorunda kaldım
Aki 28-212

10
Aslında bu cevabın neden bu kadar çok oy aldığını anlamıyorum. webView.setBackgroundColor (0x00000000); webView.setBackgroundColor (0x00FFFFFF) ile tamamen aynıdır; alfa değeri 0x00.
jptsetung

128

Daha önce bahsedilen bu sorunun altında bir çözüm var. 2 çözümün birleşimidir.

webView.setBackgroundColor(Color.TRANSPARENT);
webView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);

URL yüklendikten sonra bu kodu WebViewer'a eklerken çalışır (API 11+).

Hardeware hızlandırması AÇIK olduğunda bile çalışır


2
Web görünümü kaydırılabilir olmadığı sürece çalışır.
Rany Ishak

Samsung
S3'te

7
webView.setBackgroundColor (Color.argb (1, 0, 0, 0)); kaydırma üzerinde titrek bir arka plan istiyorsanız
Trent Seed

@Trent Metodunuzu denedim ve Jelly Bean'deki titreşim sorununu çözdüysem, ancak şimdi Gingerbread'de siyah bir arka plan görüntülüyor. Başka öneriniz var mı?
Tiago

2
Bu, web görünümü için donanım hızlandırmayı devre dışı bırakır! ! Bu benim için açık değildi (kullanmadan önce bakmama beni suçladı: D) ve cevabın son cümlesi tam tersi izlenimi bırakıyor. Bu aslında, tuval vb Geçici bir kaydırma şeylerin, videolar, UI dönüşümler, bir sürü etkileyen stackoverflow.com/a/17815574/2487876
Kristjan Liiva

36

Aynı sorunu 2.2 ve 2.3'te de yaşadım. Ben android değil html alpa değeri vererek sorunu çözdü. Birçok şeyi denedim ve öğrendiğim setBackgroundColor();renk alfa değeriyle çalışmıyor. webView.setBackgroundColor(Color.argb(128, 0, 0, 0));çalışmayacak.

işte benim çözümüm, benim için çalıştı.

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

Ve Java’da,

    webView = (WebView) findViewById(R.id.webview);
    webView.setBackgroundColor(0);
    webView.loadData(webData, "text/html", "UTF-8");

Ve işte aşağıdaki Çıktı ekran görüntüsü.resim açıklamasını buraya girin


Mükemmel, teşekkürler!
Ayman Mahgoub


22

Bunu şu şekilde yapabilirsiniz:

Öncelikle proje tabanınızı 11'e ayarlayın, ancak Android'deManifest minSdkVersion'ı 8 olarak ayarlayın

android: hardwareAccelerated = "false" gereksiz ve 8 ile uyumsuz

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

Güvenlik için bunu tarzınıza ekleyin:

BODY, HTML {background: transparent}

2.2 ve 4'te benim için çalıştı


bu benim için çalışıyor: android: hardwareAccelerated = "false" BODY, HTML {arka plan: şeffaf}
jayellos

12

En önemli şeyden bahsedilmedi.

Html ,body olarak background-colorayarlanmış bir etikete sahip olmalıdırtransparent .

Yani tam çözüm:


HTML

    <body style="display: flex; background-color:transparent">some content</body>

Aktivite

    WebView wv = (WebView) findViewById(R.id.webView);
    wv.setBackgroundColor(0);
    wv.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    wv.loadUrl("file:///android_asset/myview.html");

Soruda bahsediliyor. Ancak bu, tüm android sürümlerinde çalışmasını istiyorsanız ne yapmanız gerektiğinin güzel bir özgeçmişi gibi görünüyor.
jptsetung

9

kodun altında Android 3.0+ çalışıyor ama android 3.0'ın altında bu kodu denediğinizde uygulamanız zorla kapatıldı.

webView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);

API 11'in altında kodunuzda aşağıdaki kodu deneyin .

webview.setBackgroundColor(Color.parseColor("#919191"));

Veya

ayrıca tüm API para cezası üzerinde çalışan kodu deneyebilirsiniz .

    webview.setBackgroundColor(Color.parseColor("#919191"));
    if (Build.VERSION.SDK_INT >= 11) {
        webview.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
    }

yukarıdaki kod benim için tam kullanın.


SetLayerType öğesini LAYER_TYPE_SOFTWARE olarak ayarlamanızı önermiyorum. Özellikle kaydırma sırasında performansı önemli ölçüde azaltır.
Navarr

8

Deneyin webView.setBackgroundColor(0);


1
WebView.setBackgroundColor (0x00FFFFFF) arasında fark yoktur; ve webView.setBackgroundColor (0x00); Her ikisinin de şeffaf renk olması gerekiyor.
jptsetung

7

Birden fazla webviews var ve aralarında kaydırma biraz halsiz olsa da, benim için aşağıdaki kod çalışması.

v.setBackgroundColor(Color.TRANSPARENT);
Paint p = new Paint();
v.setLayerType(LAYER_TYPE_SOFTWARE, p); 

3
Bu Honeycomb'da çalışır, ancak maalesef ICS'de yoktur. Lanet olsun. Ancak bunu kullanırsanız, "android: layerType" özelliğini kullanarak mizanpaj dosyasında belirtmek daha kolaydır; çünkü bu, etiketin yok sayılacağı eski sürümlerde de iyi çalışır.
sven

2
ICS'de bile çalışan android:hardwareAccelerated="false", activityöğe için AndroidManifest'te kullanarak tüm etkinlik için donanım hızlandırmayı devre dışı bırakmaktır .
sven

1
Paint nesnesi oluşturmak gereksizdir. v.setLayerType(LAYER_TYPE_SOFTWARE, null);ayrıca çalışacaktır.
Sergey Glotov


6
  • Yukarıda verilen her şeyi denedikten sonra. / ' Dan
    webView.setBackgroundColor(Color.TRANSPARENT)önce veya sonra belirtmeniz önemli değil .loadUrl()loadData()
  • Önemli android:hardwareAccelerated="false"olan, manifestte açıkça beyan etmeniz gerektiğidir .

IceCream Sandviç üzerinde test edildi


3

Sadece bu hatları kullanın .....

webView.loadDataWithBaseURL(null,"Hello", "text/html", "utf-8", null);
webView.setBackgroundColor(0x00000000);

Web görünümünde veri yükledikten sonra her zaman arka plan rengini ayarlayan bir noktayı unutmayın .


3
webView.setBackgroundColor(0x00000000);
webView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);

Bu kesinlikle işe yarayacaktır .. Editbackground ile XML arka plan ayarlayın. Şimdi o arka plan gösterilecek


2

html'yi yükledikten sonra bg'yi ayarlayın (hızlı testlerden html'nin yüklenmesi bg rengini sıfırlar gibi görünüyor .. bu 2.3 içindir).

html'yi zaten aldığınız verilerden yüklüyorsanız, sadece bg'yi (örneğin saydam olarak) ayarladığınız bir .postDelayed yapmak yeterlidir ..


2

Web görünümü kaydırılabilir durumdaysa:

  1. Bunu Manifest'e ekleyin:

    android:hardwareAccelerated="false"

VEYA

  1. Mizanpajda WebView'a aşağıdakileri ekleyin:

    android:background="@android:color/transparent"
    android:layerType="software"
  2. Ebeveyn kaydırma görünümüne aşağıdakileri ekleyin:

    android:layerType="software"

0

WebView.setBackgroundColor (Color.parseColor ("# EDEDED"));


0

GL görünümümün üzerine şeffaf bir HTML yer paylaşımı koymaya çalışıyordum, ancak GL görünümümü kapsayan her zaman siyah titriyor. Bu titreşimden kurtulmaya çalışırken birkaç gün sonra benim için kabul edilebilir olan bu çözümü buldum (ama android için bir utanç).

Sorun şu ki, güzel CSS animasyonlarım için donanım hızlandırmaya ihtiyacım var. webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); bir seçenek değil.

İşin püf noktası, WebViewGL görünümüm ile HTML yer paylaşımı arasına ikinci (boş) koymaktı . BudummyWebView SW modunda oluşturmamı söyledim ve şimdi HTML bindirmelerim HW'de pürüzsüz hale geliyor ve artık siyah titremiyor.

Bunun Acer Iconia A700 dışındaki cihazlarda çalışıp çalışmadığını bilmiyorum, ancak umarım bu konuda birine yardım edebilirim.

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

Bunu bir Galaxy Nexus üzerinde test ettim ve maalesef titrek kaldı.
Navarr

0

Bu benim için çalıştı. veri yüklendikten sonra arka plan rengini ayarlamayı deneyin. webview nesnenizde bu setWebViewClient için:

    webView.setWebViewClient(new WebViewClient(){

        @Override
        public void onPageFinished(WebView view, String url)
        {
            super.onPageFinished(view, url);
            webView.setBackgroundColor(Color.BLACK);
        }
    });


0

Hiçbir şey yardımcı olmazsa, büyük olasılıkla sabit webViewboyutludur, genişliğini ve yüksekliğini wrap_content olarak değiştirin veya match_parentçalışması gerekir. Bir Gif yüklemeye çalıştığımda bu benim için çalıştı.


0

BindingAdapter kullanıcısını şu şekilde kullanabilirsiniz:

Java

@BindingAdapter("setBackground")
public static void setBackground(WebView view,@ColorRes int resId) {
        view.setBackgroundColor(view.getContext().getResources().getColor(resId));
        view.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
}

XML:

<layout >

    <data>

        <import type="com.tdk.sekini.R" />


    </data>

       <WebView
            ...
            app:setBackground="@{R.color.grey_10_transparent}"/>

</layout>

kaynaklar

<color name="grey_10_transparent">#11e6e6e6</color>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.