Android WebView 样式背景颜色:在 android 2.2 上忽略透明

Posted

技术标签:

【中文标题】Android WebView 样式背景颜色:在 android 2.2 上忽略透明【英文标题】:Android WebView style background-color:transparent ignored on android 2.2 【发布时间】:2011-06-27 13:15:03 【问题描述】:

我正在努力创建一个具有透明背景的 WebView。

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

然后我用

加载一个html页面
<body style="background-color:transparent;" ...

WebView 的背景颜色是透明的,但一旦加载页面,它就会被 html 页面中的黑色背景覆盖。这只发生在 android 2.2 上,它适用于 android 2.1。

那么在 html 页面代码中是否需要添加一些内容以使其真正透明?

【问题讨论】:

很抱歉,但对于我的问题,这里没有列出任何解决方案... :=( 无论如何谢谢...网页总是使用白色背景... 【参考方案1】:

试试 webView.setBackgroundColor(0);

【讨论】:

webView.setBackgroundColor(0x00FFFFFF); 没有区别和 webView.setBackgroundColor(0x00);两者都应该是透明的颜色。【参考方案2】:

实际上这是一个错误,到目前为止没有人找到解决方法。已创建问题。这个 bug 仍然存在于蜂窝中。

如果您认为它很重要,请加注星标:http://code.google.com/p/android/issues/detail?id=14749

【讨论】:

【参考方案3】:

这对我有用,

mWebView.setBackgroundColor(Color.TRANSPARENT);

【讨论】:

你真的在 os 2.2 上测试过吗? 我发现这必须在 AFTER 加载 url 或数据之后调用。 如果您使用android:hardwareAccelerated="true",它在android 3.x 中不起作用 请注意,在 ICS(4.0.3) 上,除了上述 cmets;我必须禁用“设置 -> 开发人员选项 -> 强制 GPU 渲染”才能获得透明度以使用 API 级别 10。 实际上我不明白为什么这个答案会得到这么多赞成票。 webView.setBackgroundColor(0x00000000);与 webView.setBackgroundColor(0x00FFFFFF) 完全相同; alpha 值为 0x00。【参考方案4】:

以下代码对我有用,尽管我有多个 webviews 并且在它们之间滚动有点慢。

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

【讨论】:

这适用于 Honeycomb,但不幸的是不适用于 ICS。该死。但是如果你使用它,使用“android:layerType”属性在布局文件中指定它会更容易,因为这在旧版本上也能很好地工作,标签将被忽略。 在 ICS 上的工作是使用 AndroidManifest 中的 android:hardwareAccelerated="false"activity 元素停用整个活动的硬件加速。 没有必要创建 Paint 对象。 v.setLayerType(LAYER_TYPE_SOFTWARE, null); 也可以。【参考方案5】:

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

如果您从已经获得的数据中加载 html,只需执行 .postDelayed 并在其中设置 bg(例如透明)就足够了..

【讨论】:

【参考方案6】:

我在 2.2 和 2.3 中也遇到了同样的问题。我通过在 html 中给出 alpa 值而不是在 android 中解决了这个问题。我尝试了很多东西,我发现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");

下面是输出截图。

【讨论】:

【参考方案7】:

this earlier mentioned issue 的底部有一个解决方案。 这是两种解决方案的组合。

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

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

它甚至在硬件加速开启时也能工作

【讨论】:

只要 Webview 不可滚动,它就可以工作。 我需要在三星 S3 上强制软件渲染后设置背景颜色 webView.setBackgroundColor(Color.argb(1, 0, 0, 0));如果您不希望滚动时背景闪烁 @Trent 我试过你的方法,如果解决了果冻豆上的闪烁问题,但现在它在姜饼上显示黑色背景。还有其他建议吗? 这会禁用 webview 的硬件加速! !这对我来说并不明显(怪我在使用 :D 之前没有查看它),答案的最后一句话留下了相反的印象。这实际上会影响很多东西,视频、UI 转换、滚动、画布等。可能的解决方法***.com/a/17815574/2487876【参考方案8】:

使用这个

WebView myWebView = (WebView) findViewById(R.id.my_web);

myWebView.setBackgroundColor(0);

【讨论】:

0 (0x00000000) = Color.TRANSPARENT 见developer.android.com/reference/android/graphics/…【参考方案9】:

试试

webView.setBackgroundColor(Color.parseColor("#EDEDED"));

【讨论】:

【参考方案10】: 在尝试了上面给出的一切之后。我发现您在loadUrl() /loadData() 之前或之后指定webView.setBackgroundColor(Color.TRANSPARENT) 都没有关系。 重要的是您应该在清单中明确声明android:hardwareAccelerated="false"

冰淇淋三明治

上测试

【讨论】:

【参考方案11】:

这就是你的做法:

首先让你的项目基于 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" BODY, HTML background: transparent【参考方案12】:

以下代码可以正常工作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。它会大大降低性能,尤其是在滚动时。【参考方案13】:

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

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

记住一点,在 webview 中加载数据后总是设置背景颜色。

【讨论】:

【参考方案14】:

我试图在我的 GL 视图上放置一个透明的 HTML 覆盖,但它总是黑色闪烁,覆盖了我的 GL 视图。经过几天试图摆脱这种闪烁,我发现这种解决方法对我来说是可以接受的(但对于 android 来说是一种耻辱)。

问题是我的漂亮 CSS 动画需要硬件加速,所以 webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 不适合我。

诀窍是在我的 GL 视图和 HTML 覆盖之间放置第二个(空的)WebView。我告诉这个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 上进行了测试,但很遗憾,闪烁仍然存在。【参考方案15】:

如果 webview 是可滚动的:

    将此添加到清单中:

    android:hardwareAccelerated="false"
    

    在布局中的WebView中添加以下内容:

    android:background="@android:color/transparent"
    android:layerType="software"
    

    将以下内容添加到父滚动视图:

    android:layerType="software"
    

【讨论】:

【参考方案16】:
webView.setBackgroundColor(0x00000000);
webView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);

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

【讨论】:

【参考方案17】:

没有提到最重要的事情。

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 版本上工作,你必须做什么。【参考方案18】:

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

    webView.setWebViewClient(new WebViewClient()

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

【讨论】:

【参考方案19】:

试用:

myWebView.setAlpha(0.2f);

【讨论】:

【参考方案20】:

如果没有任何帮助,那么很可能您已经固定了 webView 的大小,将宽度和高度更改为 wrap_content 或 match_parent,它应该可以工作。当我尝试加载 Gif 时,这对我有用。

【讨论】:

【参考方案21】:
myWebView.setAlpha(0);

是最好的答案。有效!

【讨论】:

请解释原因。【参考方案22】:

您可以像这样使用 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>

【讨论】:

【参考方案23】:

这没用,

android:background="@android:color/transparent"

webview 背景颜色设置为工作状态

webView.setBackgroundColor(0)

另外,我将可绘制的窗口背景设置为透明

【讨论】:

以上是关于Android WebView 样式背景颜色:在 android 2.2 上忽略透明的主要内容,如果未能解决你的问题,请参考以下文章

Android WebView 背景颜色

如何改变webView背景颜色?

如何更改 Android 布局样式中继承样式的背景颜色?

如何修改WebView 中点击文字链接时的文字背景色

android alertDialog如何改变其样式,就是可以修改其背景,让背景为其他的颜色或背景图

Flutter webview 文本选择句柄颜色