【问题标题】:Android WebView style background-color:transparent ignored on android 2.2Android WebView 样式背景颜色:在 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 页面代码中是否需要添加一些内容以使其真正透明?

【问题讨论】:

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

标签: android background webview transparency transparent


【解决方案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 转换、滚动、画布等。可能的解决方法stackoverflow.com/a/17815574/2487876
        【解决方案8】:

        使用这个

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

        【讨论】:

        【解决方案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 是可滚动的:

              1. 将此添加到清单中:

                android:hardwareAccelerated="false"
                

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

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

                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)
                          

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

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2012-06-10
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2012-09-23
                            • 2021-12-30
                            相关资源
                            最近更新 更多