Цвет фона Android WebView: прозрачный игнорируется на Android 2.2


157

Я изо всех сил пытаюсь создать WebView с прозрачным фоном.

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

Затем я загружаю HTML-страницу с

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

Цвет фона WebView прозрачен, но как только страница загружается, она перезаписывается черным фоном с html-страницы. Это происходит только на Android 2.2, работает на Android 2.1.

Так есть ли что добавить в HTML-код страницы, чтобы сделать его действительно прозрачным?


1
Извините, но из-за моей проблемы ни одно из перечисленных здесь решений не сработало ...: = (в любом случае, спасибо ... на веб-странице всегда использовался белый фон ...
cV2

Ответы:


292

Это сработало для меня,

mWebView.setBackgroundColor(Color.TRANSPARENT);

1
Вы действительно тестировали на OS 2.2?
jptsetung

87
Я обнаружил, что это должно называться ПОСЛЕ загрузки URL или данных.
Марк

11
он не работает в Android 3.x, если вы используетеandroid:hardwareAccelerated="true"
Macarse

2
Обратите внимание, что на ICS (4.0.3), в дополнение к вышеупомянутым комментариям; Мне пришлось отключить «Настройки -> Параметры разработчика -> Принудительный рендеринг с помощью графического процессора», чтобы обеспечить прозрачность для работы с API уровня 10.
Aki

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

128

В нижней части этой ранее упомянутой проблемы есть решение. Это комбинация из 2 решений.

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 Я попробовал ваш метод и, если исправил проблему мерцания на Jelly Bean, но теперь он отображает черный фон на Gingerbread. Любое другое предложение?
Тиаго

2
Это отключает аппаратное ускорение для веб-просмотра! ! Это было неочевидно для меня (вините меня в том, что я не нашел его перед использованием: D), и последнее предложение ответа оставляет противоположное впечатление. На самом деле это влияет на многие вещи, видео, преобразования пользовательского интерфейса, прокрутку, холст и т. Д. Возможный обходной путь stackoverflow.com/a/17815574/2487876
Кристьян Лиива,

36

У меня была такая же проблема с 2.2, а также в 2.3. Я решил проблему, указав значение alpa в 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>");

И на Яве,

    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 = "false" ТЕЛО, HTML {background: transparent}
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
Это работает на сотовой, но, к сожалению, не на ICS. Черт. Но если вы используете его, проще указать его в файле макета, используя свойство «android: layerType», поскольку это также будет хорошо работать в старых версиях, где тег будет просто игнорироваться.
Свен

2
Что работает даже на ICS, так это отключение аппаратного ускорения для всей деятельности с использованием android:hardwareAccelerated="false"AndroidManifest для activityэлемента.
Свен

1
Нет необходимости создавать объект Paint. v.setLayerType(LAYER_TYPE_SOFTWARE, null);и будет работать.
Сергей Глотов


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

Проверено на IceCream Sandwich


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. После нескольких дней, пытаясь избавиться от этого мерцания, я нашел этот обходной путь, который является приемлемым для меня (но позор для Android).

Проблема в том, что мне нужно аппаратное ускорение для моих хороших 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 как:

    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 следующим образом:

Ява

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