Android WebView शैली पृष्ठभूमि-रंग: Android 2.2 पर पारदर्शी अनदेखा


156

मैं पारदर्शी पृष्ठभूमि के साथ एक WebView बनाने के लिए संघर्ष कर रहा हूं।

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

फिर मैंने एक html पेज लोड किया

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

WebView की पृष्ठभूमि का रंग पारदर्शी है, लेकिन जैसे ही पृष्ठ लोड होता है, यह html पृष्ठ से एक काली पृष्ठभूमि द्वारा अधिलेखित हो जाता है। यह केवल एंड्रॉइड 2.2 पर होता है, यह एंड्रॉइड 2.1 पर काम करता है।

तो क्या एचटीएमएल पेज कोड में जोड़ने के लिए कुछ है जो इसे वास्तव में पारदर्शी बनाता है?


1
मुझे खेद है, लेकिन मेरी समस्या के लिए यहां सूचीबद्ध कोई समाधान काम नहीं किया ...: = (thx anyways .. वेबपेज ने हमेशा एक सफेद पृष्ठभूमि का उपयोग किया ...
cV2

जवाबों:


291

इसने मेरे लिए काम किया,

mWebView.setBackgroundColor(Color.TRANSPARENT);

1
क्या आपने वास्तव में ओएस 2.2 पर परीक्षण किया है?
जिप्सेटुंग

87
मैंने पाया कि इसे url या डेटा लोड करने के बाद AFTER कहा जाता है ।
मार्क

11
यदि आप उपयोग कर रहे हैं तो यह एंड्रॉइड 3.x में काम नहीं करता हैandroid:hardwareAccelerated="true"
मैकरस

2
उपरोक्त टिप्पणियों के अलावा, आईसीएस (4.0.3) पर ध्यान दें; मुझे एपीआई स्तर 10. के साथ काम करने के लिए पारदर्शिता प्राप्त करने के लिए "सेटिंग्स -> डेवलपर विकल्प -> फोर्स जीपीयू रेंडरिंग" को निष्क्रिय करना था
अकी

10
स्वाभाविक रूप से मुझे समझ में नहीं आता है कि इस उत्तर को इतने वोट क्यों मिलते हैं। webView.setBackgroundColor (0x00000000); बिल्कुल वैसा ही है जैसा कि webView.setBackgroundColor (0x00FFFFFF); अल्फा मान 0x00 है।
जिप्सेटुंग

128

इस पहले उल्लेखित मुद्दे के नीचे एक समाधान है। यह 2 समाधानों का एक संयोजन है।

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

Url लोड करने के बाद WebViewer में इस कोड को जोड़ने पर , यह काम करता है (API 11+)।

यह तब भी काम करता है जब हार्डवेयर त्वरण चालू होता है


2
यह तब तक काम करता है जब तक कि वेबव्यू स्क्रॉल करने योग्य नहीं है।
रानी इशक

मैं सैमसंग S3 पर बल सॉफ्टवेयर प्रतिपादन के बाद पृष्ठभूमि रंग सेट की जरूरत है
newworld

7
webView.setBackgroundColor (Color.argb (1, 0, 0, 0)); अगर आप स्क्रॉल पर कोई बैकग्राउंड नहीं देखना चाहते हैं
ट्रेंट सीड

@ वर्तमान में मैंने आपके तरीके की कोशिश की और अगर जेली बीन पर झिलमिलाहट की समस्या को ठीक किया, लेकिन अब यह जिंजरब्रेड पर एक काली पृष्ठभूमि प्रदर्शित करता है। कोई और सुझाव?
टिआगो

2
यह वेबव्यू के लिए हार्डवेयर त्वरण को निष्क्रिय करता है! ! यह मेरे लिए स्पष्ट नहीं था (उपयोग करने से पहले इसे नहीं देखने के लिए मुझ पर दोष: डी), और उत्तर का अंतिम वाक्य विपरीत प्रभाव छोड़ता है। यह वास्तव में बहुत सी चीजों, वीडियो, यूआई ट्रांसफॉर्मेशन, स्क्रॉलिंग, कैनवास आदि को प्रभावित करता है stackoverflow.com/a/17815574/2487876
क्रिस्ट्यन Liiva

36

मैं 2.2 के साथ भी यही मुद्दा था और 2.3 में भी। मैंने html में alpa value नहीं 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");

और यहाँ नीचे आउटपुट स्क्रीनशॉट है।यहां छवि विवरण दर्ज करें


पूर्ण धन्यवाद !
अयमान महागौब

31

वास्तव में यह एक बग है और अब तक किसी को वर्कअराउंड नहीं मिला। एक मुद्दा बनाया गया है। बग अभी भी यहां मधुकोश में है।

अगर आपको लगता है कि यह महत्वपूर्ण है तो कृपया इसे देखें: http://code.google.com/p/android/issues/detail?id=14749


22

इसे आपको इसी तरह करना होगा:

पहले अपना प्रोजेक्ट बेस 11 पर बनाएं, लेकिन AndroidManifest में minSdkVersion से 8 पर सेट करें

एंड्रॉइड: 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 {बैकग्राउंड: पारदर्शी}
jayellos

12

सबसे महत्वपूर्ण बात का उल्लेख नहीं किया गया था।

एचटीएमएल चाहिए एक है bodyके साथ टैग background-colorकरने के लिए सेटtransparent

तो पूरा समाधान होगा:


एचटीएमएल

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

यह प्रश्न में उल्लिखित है। लेकिन ऐसा लगता है कि यदि आप इसे सभी एंड्रॉइड संस्करणों पर काम करना चाहते हैं, तो आपको एक अच्छा फिर से शुरू करना होगा।
जिप्सेटुंग

9

नीचे कोड ठीक एंड्रॉइड 3.0+ पर काम करता है लेकिन जब आप एंड्रॉइड 3.0 के नीचे इस कोड को आज़माते हैं तो आपका ऐप जबरदस्ती बंद हो जाता है।

webView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);

आप अपने कम तब एपीआई 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);
    }

उपरोक्त कोड मेरे लिए पूर्ण उपयोग करें।


मैं आपको LAYER_TYPE_SOFTWARE को सेट करने की सलाह नहीं देता। यह स्क्रॉल करते समय विशेष रूप से प्रदर्शन को कम कर देता है।
नवरेह 27'14


7

मेरे लिए कोड काम के बाद, हालांकि मेरे पास कई वेबव्यू हैं और उनके बीच स्क्रॉल करना थोड़ा सुस्त है।

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

3
यह हनीकॉम्ब पर काम करता है, लेकिन दुर्भाग्य से आईसीएस पर नहीं। अरे नहीं। लेकिन अगर आप इसका उपयोग करते हैं, तो "एंड्रॉइड: लेयर टाइप" संपत्ति का उपयोग करके इसे लेआउट फ़ाइल में निर्दिष्ट करना अधिक आसान है क्योंकि यह पुराने रिलीज पर भी अच्छी तरह से काम करेगा जहां टैग को केवल अनदेखा किया जाएगा।
स्वेन

2
आईसीएस पर भी काम कर रहा android:hardwareAccelerated="false"है activityतत्व के लिए AndroidManifest का उपयोग करके पूरी गतिविधि के लिए हार्डवेयर त्वरण को निष्क्रिय करना है।
स्व

1
पेंट ऑब्जेक्ट बनाने के लिए अनावश्यक रूप से है। v.setLayerType(LAYER_TYPE_SOFTWARE, null);भी काम करेंगे।
सेर्गेई ग्लोटोव


6
  • ऊपर दी गई हर चीज को आजमाने के बाद। मैंने पाया कि इससे कोई फर्क नहीं पड़ता कि आप
    webView.setBackgroundColor(Color.TRANSPARENT)पहले या बाद में निर्दिष्ट करते हैं loadUrl()/ loadData()
  • जो चीज आपके लिए मायने रखती है वह स्पष्ट रूप से घोषणा android:hardwareAccelerated="false"में होनी चाहिए ।

आइसक्रीम सैंडविच पर परीक्षण किया गया


3

बस इन पंक्तियों का उपयोग करें .....

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

और एक बिंदु याद रखें कि वेबव्यू में डेटा लोड करने के बाद हमेशा पृष्ठभूमि रंग सेट करें।


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

यह निश्चित रूप से काम करेगा .. एडिटबैक ग्राउंड के साथ एक्सएमएल में पृष्ठभूमि सेट करें। अब वह बैकग्राउंड दिखाया जाएगा


2

html लोड करने के बाद 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 ओवरले लगाने की कोशिश कर रहा था, लेकिन इसमें हमेशा काली झिलमिलाहट होती है जो मेरे जीएल दृश्य को कवर करती है। कई दिनों तक इस चंचलता से छुटकारा पाने की कोशिश करने के बाद मुझे यह हल मिला जो मेरे लिए स्वीकार्य है (लेकिन Android के लिए शर्म की बात है)।

समस्या यह है कि मुझे अपने अच्छे सीएसएस एनिमेशन के लिए हार्डवेयर त्वरण की आवश्यकता है और इसी तरह webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); मेरे लिए कोई विकल्प नहीं है।

चाल WebViewमेरे जीएल दृश्य और एचटीएमएल ओवरले के बीच एक दूसरा (खाली) डालने की थी । यहdummyWebView मैंने SW मोड में रेंडर करने के लिए कहा था, और अब मेरी HTML ओवरले एचडब्ल्यू में चिकनी और कोई और अधिक टिमटिमाती नहीं है।

मुझे नहीं पता कि यह मेरे एसर आइकोनिया ए 700 के अलावा अन्य उपकरणों पर काम करता है, लेकिन मुझे उम्मीद है कि मैं इसके साथ किसी की मदद कर सकता हूं।

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

मैंने गैलेक्सी नेक्सस पर इसका परीक्षण किया और टिमटिमाता रहा, दुर्भाग्य से।
नवरात्रि

0

इसने मेरे लिए काम किया। डेटा लोड होने के बाद पृष्ठभूमि का रंग सेट करने का प्रयास करें। अपने वेबव्यू ऑब्जेक्ट पर उस setWebViewClient के लिए जैसे:

    webView.setWebViewClient(new WebViewClient(){

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


0

यदि कुछ भी मदद नहीं करता है, तो संभवतः आपके पास निश्चित आकार है webView, चौड़ाई और ऊंचाई को लपेटने के लिए बदलें / महाद्वीप या match_parent, यह काम करना चाहिए। मेरे लिए यह काम किया जब मैंने एक जिफ़ लोड करने की कोशिश की।


0

आप उपयोगकर्ता को इस तरह से बाइंडिंग एडेप्टर कर सकते हैं:

जावा

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

एक्सएमएल:

<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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.