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?


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

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


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


Perfekcyjnie, dziękuję !
Ayman Mahgoub


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


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

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.


Nie polecam ustawianiaLayerType na LAYER_TYPE_SOFTWARE. Drastycznie zmniejsza wydajność, zwłaszcza podczas przewijania.
Navarr

8

Próbować webView.setBackgroundColor(0);


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

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


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.


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


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).


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"

0

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


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

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


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.


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>

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.