Фоновий колір Android WebView: прозорий ігнорується на android 2.2


156

Я намагаюся створити WebView з прозорим фоном.

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

Потім я завантажую сторінку HTML

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

Колір фону WebView прозорий, але як тільки сторінка завантажується, її замінює чорний фон зі сторінки html. Це відбувається лише на Android 2.2, він працює на android 2.1.

То чи є щось додати в код сторінки HTML, щоб зробити його дійсно прозорим?


1
Вибачте, але для моєї проблеми жодне з перелічених тут проблем не спрацювало ...: = (все-таки thx .. веб-сторінка завжди використовувала білий фон ...
cV2

Відповіді:


291

Це працювало для мене,

mWebView.setBackgroundColor(Color.TRANSPARENT);

1
Ви дійсно тестували на OS 2.2?
jptsetung

87
Я виявив, що це потрібно викликати ПІСЛЯ завантаження URL-адреси або даних.
Марк

11
він не працює в android 3.x, якщо ви використовуєтеandroid:hardwareAccelerated="true"
Macarse

2
Зауважте, що на ICS (4.0.3), крім вищезазначених коментарів; Мені довелося вимкнути "Налаштування -> Опції для розробників -> Примусовий рендеринг GPU", щоб отримати прозорість для роботи з API рівня 10.
Aki

10
Насправді я не розумію, чому ця відповідь набирає стільки голосів. webView.setBackgroundColor (0x00000000); точно такий же, як webView.setBackgroundColor (0x00FFFFFF); значення альфа 0x00.
jptsetung

128

У нижній частині цього раніше згаданого питання є рішення. Це поєднання двох рішень.

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

Коли ви додаєте цей код у WebViewer після завантаження URL-адреси, він працює (API 11+).

Він працює навіть тоді, коли прискорення програмного забезпечення ввімкнено


2
Він працює до тих пір, поки Webview не прокручується.
Рані Ішак

Мені знадобився встановити колір фону після силового візуалізації програмного забезпечення на samsung S3
neworld

7
webView.setBackgroundColor (Color.argb (1, 0, 0, 0)); якщо ви не хочете, щоб фоновий мерехтів на прокрутці
Trent Seed

@Trent Я спробував ваш метод і якщо вирішив проблему мерехтіння на Jelly Bean, але тепер він показує чорний фон на Пряники. Будь-яка інша пропозиція?
Тіаго

2
Це вимикає апаратне прискорення для веб-перегляду! ! Це для мене було не очевидно (звинувачуйте мене в тому, що я не шукав його перед використанням: D), а останнє речення відповіді залишає протилежне враження. Це насправді впливає на багато речей, відео, перетворень інтерфейсу користувача, прокрутки, полотна тощо. Можливе вирішення stackoverflow.com/a/17815574/2487876
Kristjan Liiva

36

У мене був такий самий випуск з 2.2, а також з 2.3. Я вирішив проблему, надавши значення альпи в html не в android. Я спробував багато речей, і я дізнався, що setBackgroundColor();колір не працює зі значенням альфа. webView.setBackgroundColor(Color.argb(128, 0, 0, 0));не вийде.

тому ось моє рішення, що працювало на мене.

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

І на Java,

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

А ось скріншот виводу нижче.введіть тут опис зображення


Ідеально, дякую!
Айман Махгуб


22

Ось як ви це робите:

Спочатку зробіть проектну базу на 11, але в AndroidManifest встановіть minSdkVersion на 8

android: hardwareAccelerated = "false" зайвий, і він несумісний з 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);
    }
});

Для безпеки введіть це у свій стиль:

BODY, HTML {background: transparent}

працював на мене 2.2 та 4


це працює для мене: android: hardwareAccelerated = "помилковий" BODY, HTML {фон: прозорий}
jayellos

12

Найголовніше не згадувалося.

У html повинен бути bodyтег із background-colorвстановленим на transparent.

Тож повним рішенням було б:


HTML

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

Діяльність

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

Про це йдеться у питанні. Але це здається гарним резюме того, що вам потрібно зробити, якщо ви хочете, щоб він працював на всіх версіях Android.
jptsetung

9

нижче код працює відмінно Android 3.0+, але якщо ви спробуєте цей код нижче Android 3.0, то ваша програма накладено закрито.

webView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);

Ви спробуйте внизу код на менш ніж API 11 .

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

Або

ви також можете спробувати нижче код, який працює на всіх API добре.

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

вище код використовувати повне для мене.


Я не рекомендую встановлювати тип "LayerType" на LAYER_TYPE_SOFTWARE. Це різко знижує продуктивність, особливо під час прокрутки.
Наварр

8

Спробуйте webView.setBackgroundColor(0);


1
Немає різниці між webView.setBackgroundColor (0x00FFFFFF); та webView.setBackgroundColor (0x00); Обидва повинні бути прозорого кольору.
jptsetung

7

Після роботи коду для мене, хоча у мене є декілька веб-переглядів, і прокрутка між ними трохи млява.

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

3
Це працює на Honeycomb, але, на жаль, не на ICS. Блін. Але якщо ви використовуєте його, простіше вказати його у файлі макета за допомогою властивості "android: layerType", оскільки це також буде добре працювати у старих випусках, де тег буде просто проігноровано.
sven

2
Навіть на ICS працює дезактивація апаратного прискорення для всієї діяльності за допомогою елемента android:hardwareAccelerated="false"AndroidManifest activity.
sven

1
Немає необхідності створювати об’єкт Paint. v.setLayerType(LAYER_TYPE_SOFTWARE, null);також буде працювати.
Сергій Глотов


6
  • Спробувавши все, що було сказано вище. Я виявив, що це не має значення ні ви вказали
    webView.setBackgroundColor(Color.TRANSPARENT)до, ні після loadUrl()/ loadData().
  • Важливим є те, що ви повинні чітко заявити android:hardwareAccelerated="false"в маніфесті.

Тестували на сендвіч-морозиві


3

Просто використовуйте ці рядки .....

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

І пам’ятайте про момент, який завжди встановлюйте колір фону після завантаження даних у веб-перегляді.


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

це обов'язково спрацює .. встановіть фон у XML за допомогою Editbackground. Тепер цей фон буде показаний


2

встановіть bg після завантаження html (з швидких тестів здається, що завантаження html скидає колір bg .. це для 2.3).

якщо ви завантажуєте html з уже отриманих даних, досить зробити .postDelayed, в якому ви просто встановите bg (наприклад, прозорий).


2

Якщо веб-перегляд прокручується:

  1. Додайте це до Маніфесту:

    android:hardwareAccelerated="false"

АБО

  1. Додайте до макета WebView наступне:

    android:background="@android:color/transparent"
    android:layerType="software"
  2. Додайте до подання прокрутки батьків таке:

    android:layerType="software"


0

Я намагався нанести прозорий HTML-накладку на мій погляд GL, але він завжди чорним мерехтінням, який покриває мій погляд GL. Після декількох днів, намагаючись позбутися цього мерехтіння, я знайшов таке рішення, яке для мене є прийнятним (але прикро для андроїда).

Проблема полягає в тому, що мені потрібне апаратне прискорення для моїх приємних анімацій CSS, і тому webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);це не є для мене варіантом.

Трюк полягав у тому, щоб покласти друге (порожнє) WebViewміж моїм переглядом GL та HTML-накладкою. Це dummyWebViewя наказав рендерувати в режимі SW, і тепер мої HTML-накладки роблять гладкими в HW і більше немає чорного мерехтіння.

Я не знаю, чи працює це на інших пристроях, ніж My Acer Iconia A700, але я сподіваюся, що я можу допомогти комусь у цьому.

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

Я тестував це на Galaxy Nexus, і мерехтливість залишилася, на жаль.
Наварр

0

Це працювало для мене. спробуйте встановити колір тла після завантаження даних. для цього setWebViewClient вашого об’єкта веб-перегляду, наприклад:

    webView.setWebViewClient(new WebViewClient(){

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


0

Якщо нічого не допомагає, то, швидше за все, ви зафіксували розміри webView, змінили ширину і висоту на wrap_content або match_parent, це повинно працювати. Це працювало для мене, коли я намагався завантажити Gif.


0

Ви можете користуватися BindingAdapter так:

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>

Ресурси

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.