Màu nền kiểu Android WebView: trong suốt bị bỏ qua trên Android 2.2


156

Tôi đang vật lộn để tạo một WebView với nền trong suốt.

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

Sau đó, tôi tải một trang html với

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

Màu nền của WebView trong suốt nhưng ngay khi trang được tải, nó bị ghi đè bởi nền đen từ trang html. Điều này chỉ xảy ra trên Android 2.2, nó hoạt động trên Android 2.1.

Vì vậy, có một cái gì đó để thêm vào mã trang html để làm cho nó thực sự minh bạch?


1
Tôi rất tiếc phải nói, nhưng đối với vấn đề của tôi, không có giải pháp nào được liệt kê ở đây hoạt động ...: = (dù sao đi nữa .. trang web luôn sử dụng nền trắng ...
cV2

Câu trả lời:


291

Điều này làm việc cho tôi,

mWebView.setBackgroundColor(Color.TRANSPARENT);

1
Bạn đã thực sự thử nghiệm trên os 2.2 chưa?
jptsetung

87
Tôi thấy rằng điều này phải được gọi là SAU khi tải url hoặc dữ liệu.
Đánh dấu

11
Nó không hoạt động trong Android 3.x nếu bạn đang sử dụngandroid:hardwareAccelerated="true"
Macude

2
Lưu ý rằng trên ICS (4.0.3), ngoài các ý kiến ​​trên; Tôi đã phải tắt "Cài đặt -> Tùy chọn nhà phát triển -> Buộc kết xuất GPU" để có được tính minh bạch để hoạt động với API cấp 10.
Aki

10
Thỉnh thoảng tôi không hiểu tại sao câu trả lời này lại nhận được nhiều phiếu bầu đến vậy. webView.setBackgroundColor (0x00000000); hoàn toàn giống với webView.setBackgroundColor (0x00FFFFFF); giá trị alpha là 0x00.
jptsetung

128

Ở dưới cùng của vấn đề được đề cập trước đó có một giải pháp. Đó là sự kết hợp của 2 giải pháp.

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

Khi thêm mã này vào WebViewer sau khi tải url, nó hoạt động (API 11+).

Nó thậm chí hoạt động khi tăng tốc phần cứng


2
Nó hoạt động miễn là Webview không thể cuộn được.
Rany Ishak

Tôi cần cài đặt màu nền sau khi kết xuất phần mềm trên samsung S3
newworld

7
webView.setBackgroundColor (Color.argb (1, 0, 0, 0)); nếu bạn không muốn nhấp nháy nền khi cuộn
Hạt giống

@Trent Tôi đã thử phương pháp của bạn và nếu đã khắc phục sự cố nhấp nháy trên Jelly Bean, nhưng bây giờ nó sẽ hiển thị nền đen trên Gingerbread. Có đề nghị nào khác không?
Tiago

2
Điều này vô hiệu hóa tăng tốc phần cứng cho webview! ! Điều này không rõ ràng đối với tôi (đổ lỗi cho tôi vì đã không tra cứu nó trước khi sử dụng: D) và câu cuối cùng của câu trả lời để lại ấn tượng ngược lại. Điều này thực sự ảnh hưởng đến rất nhiều thứ, video, chuyển đổi giao diện người dùng, cuộn, canvas, v.v ... Một stackoveround
quyết.com / a / 17815574/487876

36

Tôi đã có cùng một vấn đề với 2.2 và cũng trong 2.3. Tôi đã giải quyết vấn đề bằng cách đưa ra giá trị alpa trong html không phải trong Android. Tôi đã thử nhiều thứ và những gì tôi phát hiện ra là setBackgroundColor();màu sắc không hoạt động với giá trị alpha. webView.setBackgroundColor(Color.argb(128, 0, 0, 0));sẽ không làm việc.

Vì vậy, đây là giải pháp của tôi, làm việc cho tôi.

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

Và trong Java,

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

Và đây là ảnh chụp màn hình đầu ra bên dưới.nhập mô tả hình ảnh ở đây


Hoàn hảo, cảm ơn bạn!
Ayman Mahgoub 17/1/2015


22

Đây là cách bạn làm điều đó:

Trước tiên, hãy tạo dự án của bạn trên 11, nhưng trong AndroidManifest, đặt minSdkVersion thành 8

android: phần cứngAccelerated = "false" là không cần thiết và nó không tương thích với 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);
    }
});

Để an toàn, hãy đặt nó theo phong cách của bạn:

BODY, HTML {background: transparent}

làm việc cho tôi vào ngày 2.2 và 4


cái này hoạt động với tôi: android: phần
cứngAccelerated

12

Điều quan trọng nhất đã không được đề cập.

Html phải có một bodythẻ với background-colorthiết lập transparent.

Vì vậy, giải pháp đầy đủ sẽ là:


HTML

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

Hoạt động

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

Nó được đề cập trong câu hỏi. Nhưng đây có vẻ là một bản lý lịch tốt đẹp về những gì bạn phải làm nếu bạn muốn nó hoạt động trên tất cả các phiên bản Android.
jptsetung

9

Mã bên dưới hoạt động tốt Android 3.0+ nhưng khi bạn thử mã này bên dưới Android 3.0 thì ứng dụng của bạn sẽ bị đóng mạnh.

webView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);

Bạn thử mã dưới đây trên API 11 ít hơn .

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

Hoặc là

bạn cũng có thể thử mã bên dưới hoạt động trên tất cả các API tốt.

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

ở trên mã sử dụng đầy đủ cho tôi.


Tôi không khuyên bạn nên đặtLayerType thành LAYER_TYPE_SOFTWARE. Nó làm giảm đáng kể hiệu suất đặc biệt là khi cuộn.
Navarr

8

Thử webView.setBackgroundColor(0);


1
Không có sự khác biệt giữa webView.setBackgroundColor (0x00FFFFFF); và webView.setBackgroundColor (0x00); Cả hai đều được cho là màu trong suốt.
jptsetung

7

Theo mã làm việc cho tôi, mặc dù tôi có nhiều lần xem web và cuộn giữa chúng hơi chậm chạp.

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

3
Điều này hoạt động trên Honeycomb, nhưng tiếc là không phải trên ICS. Chỉ trích. Nhưng nếu bạn sử dụng nó, việc chỉ định nó trong tệp bố cục sẽ dễ dàng hơn bằng cách sử dụng thuộc tính "android: layerType" vì điều này cũng sẽ hoạt động tốt trên các bản phát hành cũ hơn, nơi thẻ sẽ bị bỏ qua.
Sven

2
Những gì hoạt động ngay cả trên ICS là để hủy kích hoạt tăng tốc phần cứng cho toàn bộ hoạt động bằng cách sử dụng android:hardwareAccelerated="false"trong AndroidManifest cho activityphần tử.
Sven

1
Không cần thiết phải tạo đối tượng Paint. v.setLayerType(LAYER_TYPE_SOFTWARE, null);cũng sẽ làm việc
Serge Glotov


6
  • Sau khi thử mọi thứ đã cho ở trên. Tôi thấy nó không thành vấn đề hoặc bạn chỉ định
    webView.setBackgroundColor(Color.TRANSPARENT)trước hoặc sau loadUrl()/ loadData().
  • Điều quan trọng là bạn nên khai báo rõ ràng android:hardwareAccelerated="false"trong bảng kê khai.

Đã thử nghiệm trên IceCream Sandwich


3

Chỉ cần sử dụng những dòng này .....

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

Và nhớ một điểm Luôn đặt màu nền sau khi tải dữ liệu trong chế độ xem web.


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

điều này chắc chắn sẽ hoạt động .. đặt nền trong XML với Editbackground. Bây giờ nền đó sẽ được hiển thị


2

đặt bg sau khi tải html (từ các thử nghiệm nhanh, có vẻ như tải html đặt lại màu bg .. đây là cho 2.3).

nếu bạn đang tải html từ dữ liệu bạn đã có, chỉ cần thực hiện một .postDelayed trong đó bạn chỉ cần đặt bg (ví dụ trong suốt) là đủ ..


2

Nếu webview có thể cuộn:

  1. Thêm phần này vào Bản kê khai:

    android:hardwareAccelerated="false"

HOẶC LÀ

  1. Thêm phần sau vào WebView trong bố cục:

    android:background="@android:color/transparent"
    android:layerType="software"
  2. Thêm phần sau vào chế độ xem cuộn của cha mẹ:

    android:layerType="software"

0

Hãy thử webView.setBackgroundColor (Color.parseColor ("# EDEDED"));


0

Tôi đã cố gắng đặt lớp phủ HTML trong suốt lên chế độ xem GL của mình nhưng nó luôn nhấp nháy màu đen bao phủ chế độ xem GL của tôi. Sau vài ngày cố gắng để thoát khỏi sự nhấp nháy này, tôi thấy cách giải quyết này có thể chấp nhận được đối với tôi (nhưng thật xấu hổ cho Android).

Vấn đề là tôi cần tăng tốc phần cứng cho các hoạt hình CSS đẹp của mình và do đó webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);không phải là một lựa chọn cho tôi.

Mẹo là đặt một giây (trống) WebViewgiữa chế độ xem GL của tôi và lớp phủ HTML. Điều này dummyWebViewtôi đã nói để kết xuất ở chế độ SW, và bây giờ lớp phủ HTML của tôi hiển thị mượt mà trong CTNH và không còn nhấp nháy màu đen nữa.

Tôi không biết điều này có hoạt động trên các thiết bị khác ngoài Acer Iconia A700 không, nhưng tôi hy vọng tôi có thể giúp ai đó với điều này.

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

Tôi đã thử nghiệm điều này trên Galaxy Nexus và vẫn còn nhấp nháy.
Navarr

0

Điều này làm việc cho tôi. hãy thử thiết lập màu nền sau khi dữ liệu được tải. cho setWebViewClient trên đối tượng xem web của bạn như:

    webView.setWebViewClient(new WebViewClient(){

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


0

Nếu không có gì giúp được thì có lẽ bạn đã cố định kích thước webView, thay đổi chiều rộng và chiều cao thành quấn_content hoặc match_parent, nó sẽ hoạt động. Điều đó làm việc cho tôi khi tôi cố tải Gif.


0

Bạn có thể sử dụng BindingAd CHƯƠNG như thế này:

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>

Tài nguyên

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

-2
myWebView.setAlpha(0);

là câu trả lời tốt nhất Nó hoạt động!


1
Hãy giải thích tại sao là tốt.
Bận rộn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.