Kolor tła w stylu Android WebView: przezroczysty ignorowany w systemie Android 2.2

156

Staram się stworzyć WebView z przezroczystym tłem.

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

Następnie ładuję stronę HTML z

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

Kolor tła WebView jest przezroczysty, ale zaraz po załadowaniu strony jest zastępowany czarnym tłem ze strony HTML. Dzieje się tak tylko na Androidzie 2.2, działa na Androidzie 2.1.

Czy jest więc coś do dodania w kodzie strony html, aby był naprawdę przejrzysty?

jptsetung
źródło
1
Przykro mi to mówić, ale dla mojego problemu żadne z wymienionych tutaj rozwiązań nie zadziałało ...: = (mimo wszystko dzięki ... strona zawsze używała białego tła ...
cV2

Odpowiedzi:

291

To zadziałało dla mnie,

mWebView.setBackgroundColor(Color.TRANSPARENT);
scottyab
źródło
1
Czy naprawdę testowałeś system operacyjny 2.2?
jptsetung
87
Zauważyłem, że należy to wywołać PO załadowaniu adresu URL lub danych.
Mark
11
nie działa w android:hardwareAccelerated="true"
systemie
2
Zauważ, że w ICS (4.0.3), oprócz powyższych komentarzy; Musiałem wyłączyć "Ustawienia -> Opcje programisty -> Wymuś renderowanie GPU", aby uzyskać przezroczystość działającą z poziomem API 10.
Aki,
10
Właściwie nie rozumiem, dlaczego ta odpowiedź zbiera tak wiele głosów. webView.setBackgroundColor (0x00000000); jest dokładnie tym samym, co webView.setBackgroundColor (0x00FFFFFF); wartość alfa to 0x00.
jptsetung
128

U dołu tego wspomnianego wcześniej problemu znajduje się rozwiązanie. To połączenie 2 rozwiązań.

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

Dodanie tego kodu do WebViewer po załadowaniu adresu URL działa (API 11+).

Działa nawet wtedy, gdy akceleracja sprzętowa jest włączona

Ceetn
źródło
2
Działa, o ile Webview nie daje się przewijać.
Rany Ishak
Potrzebowałem ustawić kolor tła po wymuszeniu renderowania oprogramowania na Samsung S3
neworld
7
webView.setBackgroundColor (Color.argb (1, 0, 0, 0)); jeśli nie chcesz, aby tło migotało na zwoju
Trent Seed,
@Trent Wypróbowałem twoją metodę i jeśli naprawiłem problem z migotaniem na Jelly Bean, ale teraz wyświetla czarne tło na Gingerbread. Jakieś inne sugestie?
Tiago
2
Spowoduje to wyłączenie akceleracji sprzętowej widoku internetowego! ! Nie było to dla mnie oczywiste (winę za to, że nie sprawdziłem tego przed użyciem: D), a ostatnie zdanie odpowiedzi pozostawia odwrotne wrażenie. W rzeczywistości wpływa to na wiele rzeczy, filmy, transformacje interfejsu użytkownika, przewijanie, płótno itp. Możliwe obejście stackoverflow.com/a/17815574/2487876
Kristjan Liiva
36

Miałem ten sam problem z 2.2, a także z 2.3. Rozwiązałem problem, podając wartość alpa w html, a nie w Androidzie. Próbowałem wielu rzeczy i odkryłem, że setBackgroundColor();kolor nie działa z wartością alfa. webView.setBackgroundColor(Color.argb(128, 0, 0, 0));nie będzie działać.

więc oto moje rozwiązanie, które zadziałało dla mnie.

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

W Javie

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

A oto zrzut ekranu wyjściowego poniżej.wprowadź opis obrazu tutaj

osayilgan
źródło
Perfekcyjnie, dziękuję !
Ayman Mahgoub
31

W rzeczywistości jest to błąd i jak dotąd nikt nie znalazł obejścia. Utworzono problem. Błąd jest nadal w strukturze plastra miodu.

Oznacz go gwiazdką, jeśli uważasz, że to ważne: http://code.google.com/p/android/issues/detail?id=14749

jptsetung
źródło
22

Tak to się robi:

Najpierw przygotuj swój projekt na 11, ale w AndroidManifest ustaw minSdkVersion na 8

android: hardwareAccelerated = "false" jest niepotrzebne i jest niezgodne z 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);
    }
});

Dla bezpieczeństwa umieść to w swoim stylu:

BODY, HTML {background: transparent}

pracował dla mnie na 2.2 i 4

Ali
źródło
to działa dla mnie: android: hardwareAccelerated = "false" BODY, HTML {background: transparent}
jayellos
12

Najważniejsza rzecz nie została wymieniona.

HTML musi mieć bodytag z background-colorustawioną wartościątransparent .

Tak więc pełne rozwiązanie byłoby następujące:


HTML

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

Czynność

    WebView wv = (WebView) findViewById(R.id.webView);
    wv.setBackgroundColor(0);
    wv.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    wv.loadUrl("file:///android_asset/myview.html");
lilotop
źródło
Wspomina o tym pytanie. Ale to wydaje się być miłym podsumowaniem tego, co musisz zrobić, jeśli chcesz, aby działało na wszystkich wersjach Androida.
jptsetung
9

poniższy kod działa dobrze w systemie Android 3.0+, ale gdy spróbujesz tego kodu poniżej Androida 3.0, aplikacja zostanie zamknięta.

webView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);

Wypróbuj poniższy kod na swoim mniej niż API 11 .

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

Lub

możesz także wypróbować poniższy kod, który działa dobrze na wszystkich API .

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

powyższy kod użyj pełnego dla mnie.

duggu
źródło
Nie polecam ustawianiaLayerType na LAYER_TYPE_SOFTWARE. Drastycznie zmniejsza wydajność, zwłaszcza podczas przewijania.
Navarr
8

Próbować webView.setBackgroundColor(0);

Andrew Podkin
źródło
1
Nie ma różnicy między webView.setBackgroundColor (0x00FFFFFF); i webView.setBackgroundColor (0x00); Oba mają być w kolorze przezroczystym.
jptsetung
7

Poniższy kod działa dla mnie, chociaż mam wiele stron internetowych, a przewijanie między nimi jest nieco powolne.

v.setBackgroundColor(Color.TRANSPARENT);
Paint p = new Paint();
v.setLayerType(LAYER_TYPE_SOFTWARE, p); 
Umair
źródło
3
Działa to na Honeycomb, ale niestety nie na ICS. Cholera. Ale jeśli go użyjesz, łatwiej będzie określić go w pliku układu za pomocą właściwości „android: layerType”, ponieważ będzie to działać również w starszych wersjach, w których tag zostanie po prostu zignorowany.
sven
2
To, co działa nawet na ICS, to dezaktywacja akceleracji sprzętowej dla całej aktywności android:hardwareAccelerated="false"używanej w AndroidManifest dla activityelementu.
sven
1
Nie ma potrzeby tworzenia obiektu Paint. v.setLayerType(LAYER_TYPE_SOFTWARE, null);też zadziała.
Sergey Glotov
6
  • Po wypróbowaniu wszystkiego, co podano powyżej. Okazało się, że nie ma znaczenia, czy określisz go
    webView.setBackgroundColor(Color.TRANSPARENT)przed, czy po loadUrl()/loadData() .
  • Liczy się to, że powinieneś wyraźnie zadeklarować android:hardwareAccelerated="false"w manifeście.

Testowane na IceCream Sandwich

Gaurav Arora
źródło
3

Po prostu użyj tych linii .....

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

I pamiętaj o punkcie, który zawsze ustawiaj kolor tła po załadowaniu danych w widoku internetowym.

Atul Bhardwaj
źródło
3
webView.setBackgroundColor(0x00000000);
webView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);

to na pewno zadziała ... ustaw tło w XML za pomocą Editbackground. Teraz to tło zostanie pokazane

Shivendra
źródło
2

ustaw bg po załadowaniu html (z szybkich testów wygląda na to, że załadowanie html'a resetuje kolor bg .. to jest dla 2.3).

jeśli ładujesz html z danych, które już masz, wystarczy wykonać .postDelayed, w którym po prostu ustawisz bg (na przykład na przezroczysty).

Lassi Kinnunen
źródło
2

Jeśli przeglądarka internetowa jest przewijalna:

  1. Dodaj to do manifestu:

    android:hardwareAccelerated="false"

LUB

  1. Dodaj następujące elementy do WebView w układzie:

    android:background="@android:color/transparent"
    android:layerType="software"
  2. Dodaj następujące elementy do widoku przewijania rodziców:

    android:layerType="software"
Pałeczka
źródło
0

Wypróbuj webView.setBackgroundColor (Color.parseColor ("# EDEDED"));

radża
źródło
0

Próbowałem umieścić przezroczystą nakładkę HTML na moim widoku GL, ale zawsze ma czarne migotanie, które zakrywa mój widok GL. Po kilku dniach próby pozbycia się tego migotania znalazłem to obejście, które jest dla mnie akceptowalne (ale szkoda dla Androida).

Problem polega na tym, że potrzebuję akceleracji sprzętowej do moich ładnych animacji CSS i tak dalej webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); nie jest to dla mnie opcja.

Sztuczka polegała na umieszczeniu drugiego (pustego) WebViewmiędzy moim widokiem GL a nakładką HTML. To dummyWebViewkazałem renderować w trybie SW, a teraz moje nakładki HTML renderują się płynnie w HW i nie ma już czarnego migotania.

Nie wiem, czy to działa na innych urządzeniach niż mój Acer Iconia A700, ale mam nadzieję, że mógłbym komuś w tym pomóc.

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);
    }
}
Ingemar
źródło
Przetestowałem to na Galaxy Nexusie i niestety migotanie pozostało.
Navarr
0

To zadziałało dla mnie. spróbuj ustawić kolor tła po załadowaniu danych. dla tego setWebViewClient w twoim obiekcie webview, takim jak:

    webView.setWebViewClient(new WebViewClient(){

        @Override
        public void onPageFinished(WebView view, String url)
        {
            super.onPageFinished(view, url);
            webView.setBackgroundColor(Color.BLACK);
        }
    });
Abdul Mohsin
źródło
0

Spróbować:

myWebView.setAlpha(0.2f);
ABN
źródło
0

Jeśli nic nie pomaga, to najprawdopodobniej masz stały rozmiar webView, zmień szerokość i wysokość na wrap_content lub match_parentpowinno działać. To zadziałało, gdy próbowałem załadować GIF.

Hayk
źródło
0

Możesz używać BindingAdapter w ten sposób:

Jawa

@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>

Zasoby

<color name="grey_10_transparent">#11e6e6e6</color>
Ahmad Aghazadeh
źródło
-2
myWebView.setAlpha(0);

to najlepsza odpowiedź. To działa!

Drewniany duch
źródło
1
Proszę również wyjaśnić dlaczego.
Busy Bee