Android WebView样式background-color:transparent在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 2012年

Answers:


291

这对我有用

mWebView.setBackgroundColor(Color.TRANSPARENT);

1
您真的在os 2.2上测试过吗?
jptsetung 2011年

87
我发现必须在加载URL或数据调用它。
标记

11
如果使用的话,它在android 3.x中不起作用android:hardwareAccelerated="true"
Macarse 2011年

2
注意,除了上面的注释外,还有关于ICS(4.0.3)的内容;我必须禁用“设置->开发人员选项->强制GPU渲染”,才能透明地使用API​​级别10。
阿基

10
真的,我不明白为什么这个答案获得了这么多的赞成票。webView.setBackgroundColor(0x00000000); 与webView.setBackgroundColor(0x00FFFFFF)完全相同;alpha值为0x00。
jptsetung 2012年

128

前面提到的问题的底部,有一个解决方案。它是两种解决方案的组合。

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

加载网址将此代码添加到WebViewer时,它可以工作(API 11+)。

甚至在硬件加速开启时也可以使用


2
只要Webview不可滚动,它就起作用。
Rany Ishak

在三星S3上进行强制软件渲染后,我需要设置背景色
neworld,

7
webView.setBackgroundColor(Color.argb(1,0,0,0)); 如果您不希望滚动背景闪烁
Trent Seed

@Trent我尝试了您的方法,如果解决了Jelly Bean上的闪烁问题,但现在它在Gingerbread上显示黑色背景。还有其他建议吗?
Tiago

2
这将禁用Webview的硬件加速!!这对我来说不是显而易见的(责怪我在使用:D之前没有查找它),答案的最后一句给人的印象与此相反。这实际上会影响很多事情,视频,UI转换,滚动,画布等。可能的解决方法stackoverflow.com/a/17815574/2487876
Kristjan Liiva

36

我在2.2和2.3中都有相同的问题。我通过在html中而不是在android中提供alpa值解决了问题。我尝试了很多事情,发现setBackgroundColor();颜色不能与alpha值一起使用。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上为我工作


这对我
有用

12

没有提到最重要的事情。

html 的标签必须设置为bodybackground-colortransparent

因此,完整的解决方案是:


的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 2014年

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。它会极大地降低性能,尤其是在滚动时。
纳瓦尔2014年

8

尝试 webView.setBackgroundColor(0);


1
webView.setBackgroundColor(0x00FFFFFF);之间没有区别 和webView.setBackgroundColor(0x00); 两者都应该是透明的颜色。
jptsetung 2011年

7

以下代码对我有用,尽管我有多个Web视图,但它们之间的滚动有点慢。

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

3
这适用于Honeycomb,但不幸的是不适用于ICS。该死的。但是,如果使用它,则更容易使用“ android:layerType”属性在布局文件中指定它,因为这在较旧的版本中也可以很好地工作,在该版本中,标记将被忽略。
sven 2012年

2
甚至在ICS上也起作用的是android:hardwareAccelerated="false",在activity元素的AndroidManifest中使用整个活动来停用硬件加速。
sven 2012年

1
不必要创建Paint对象。v.setLayerType(LAYER_TYPE_SOFTWARE, null);也可以。
谢尔盖·格洛托夫


6
  • 尝试以上给出的所有内容之后。我发现
    webView.setBackgroundColor(Color.TRANSPARENT)loadUrl()/ 之前或之后指定都没有关系loadData()
  • 重要的是您应该android:hardwareAccelerated="false"在清单中明确声明。

经过IceCream三明治测试


3

只需使用这些行即可.....

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

记住一点,始终在将数据加载到Webview中后设置背景色。


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

这肯定会工作..使用Editbackground在XML中设置背景。现在将显示背景


2

在加载html后设置bg(从快速测试看来,加载html会重置bg颜色。这是针对2.3)。

如果要从已获取的数据加载html,则只需执行.postDelayed,在其中只需将bg(例如设置为透明)即可。


2

如果webview是可滚动的:

  1. 将此添加到清单中:

    android:hardwareAccelerated="false"

要么

  1. 将以下内容添加到布局中的WebView中:

    android:background="@android:color/transparent"
    android:layerType="software"
  2. 将以下内容添加到父级滚动视图:

    android:layerType="software"

0

尝试webView.setBackgroundColor(Color.parseColor(“#EDEDED”));


0

我试图在我的GL视图上放置一个透明的HTML覆盖层,但是它始终闪烁黑色,覆盖了我的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上进行了测试,不幸的是闪烁仍然存在。
纳瓦尔2014年

0

这对我有用。尝试在加载数据后设置背景色。对于您的webview对象上的setWebViewClient,例如:

    webView.setWebViewClient(new WebViewClient(){

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


0

如果没有任何帮助,则很可能您已固定size webView,将width和height更改为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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.