2013-02-14 58 views
15

बदलती है मैं एक ऐप बना रहा हूं जिसमें बहुत सी स्क्रीन हैं। अधिकांश स्क्रीनों में पृष्ठभूमि रंग के साथ शीर्ष पर एक दृश्य होता है। कभी कभी एक दृश्य के रंग सेट करने के बाद, # f14fb7, जब अनुप्रयोग में नेविगेट करने, अन्य विचार 'पृष्ठभूमि करने के लिए कहते हैं:एंड्रॉइड व्यू पृष्ठभूमि अप्रत्याशित रूप से

मैं अक्सर कि रंग view.setBackgroundColor (रंग) का उपयोग कर

यहाँ अजीब बात आता बदल मुझे बिना रंग के उस रंग पर सेट कर रहे हैं। यह कभी-कभी उन विचारों पर भी होता है जिनके लिए मैंने आईडी सेट नहीं की थी, इसलिए उन दृश्यों पर सेट बैकग्राउंड कॉलर नहीं कहा गया था।

यह शायद ही कभी होता है और मैंने कोशिश किए गए प्रवाह के अनुरूप नहीं है।

जब मैं ऐप को मारता हूं और इसे पुनरारंभ करता हूं, तो सबकुछ इसके जैसा काम करता है।

मेरा एकमात्र अनुमान मेमोरी रिसाव का कुछ राजा है, लेकिन मुझे आशा है कि एक सरल स्पष्टीकरण होगा।

क्या कोई ऐसा होने के किसी कारण के बारे में सोच सकता है?

* यह मेरे गैलेक्सी एस 3 पर होता है।

+2

हम समझते हैं कि करने के लिए कैसे वास्तव में आप अपने स्क्रीन और चोटी पर देखा गया बिछाने रहे हैं कुछ कोड को देखने की जरूरत है। –

+0

अच्छी तरह से हो सकता है कि आपके पास रंग के साथ बाहरी पृष्ठभूमि है और फिर आपके पास पृष्ठभूमि पारदर्शी या कुछ के साथ अन्य लेआउट हैं? – Nezam

+0

मेरे पास पोस्ट करने के लिए कोड नहीं है, क्योंकि यह पूरे ऐप में होता है। नेज़म, ऐसा कुछ भी नहीं है ... इस समस्या का 95% समय नहीं होता है। लेकिन पृष्ठभूमि सेट करने के लिए कोड view.setBackgroundColor (रंग) है ... कुछ विशेष नहीं है। अजीब चीज यह है कि यह उन अन्य स्क्रीन को प्रभावित करती है जिनके पास उस विशेष स्क्रीन से कोई लेना देना नहीं है ... इसलिए मुझे संदेह है कि यह एक स्मृति रिसाव है – dors

उत्तर

13
कोड यह आसान नहीं है बिना

... लेकिन मुझे लगता है कि आपको कई दृश्य पर एक ही ColorDrawable पुन: उपयोग कर रहे हैं और यदि आप View.setBackgroundColor() स्रोत कोड पर एक नज़र डालें:

public void setBackgroundColor(int color) { 
    if (mBGDrawable instanceof ColorDrawable) { 
     ((ColorDrawable) mBGDrawable).setColor(color); 
    } else { 
     setBackgroundDrawable(new ColorDrawable(color)); 
    } 
} 

आप देख सकते हैं कि यह बदल ColorDrawable का रंग और हर बार एक नया निर्माण न करें। मुझे पूरा यकीन है कि यही कारण है कि आपके पास यह अजीब व्यवहार है।

संपादित

जब आप android:background साथ एक्सएमएल में प्रारंभिक पृष्ठभूमि रंग सेट आप यह कर रहे हैं (android doc अनुसार):

दिए गए संसाधन के लिए पृष्ठभूमि सेट करें। संसाधन को एक ड्रायबल ऑब्जेक्ट

मेरी समझ के अनुसार यह inflate के दौरान क्षेत्र View.mBGDrawable सेट करेगा। मेरा सुझाव है कि आप setBackgroung(the_color_int_code) के बजाय View.setBackgoundDrawable(new ColorDrawable(the_color_int_code))) का उपयोग करें। यह आपकी समस्या को हल करना चाहिए।

+0

आपको क्यों लगता है कि मैं एकाधिक रंगों पर एक ही रंग ड्रॉइंग का उपयोग करता हूं? जैसा कि आप स्रोत कोड में देख सकते हैं, मैं बस एक रंग (int) पास करता हूं, और दृश्य वर्ग ने यदि आवश्यक हो तो एक नया रंग निकालने योग्य उदाहरण बनाया है। और भी, जब यह चरण व्यवहार होता है, यदि मैं विचारों को रंग डीबग करता हूं तो ऐसा लगता है कि इसमें सही रंग सेट है, वास्तव में जब एक अलग रंग दिखाया जाता है। – dors

+0

मेरे सुझाव को मान्य करने के लिए या नहीं: जब डीबगिंग दो विचारों के 'एमबीजी ड्रायबल' के संदर्भ को गलत तरीके से प्रदर्शित करने के संदर्भ में नोट करता है। यदि यह वही संदर्भ है, तो मेरा सुझाव सही है। – ben75

+0

और यदि आप सही हैं, तो मैं इसे कैसे ठीक कर सकता हूं? मैं एक नया रंग हटाने योग्य उदाहरण नहीं बना रहा हूं, व्यू क्लास – dors

1

"मूल्य" फ़ोल्डर के अंतर्गत "colors.xml" फ़ाइल बनाएं। उदाहरण:

<?xml version="1.0" encoding="utf-8"?> 
<resources><color name="pink">#f14fb7</color></resources> 

उपयोग view.setBackgroundResource(R.color.pink);

5

यह आमतौर पर होता है अगर आप एक दृश्य जिसका रंग एक्सएमएल पूर्व में सेट किया गया है:

android:background="@color/cyan" 

अब इस आंतरिक रूप से बनाता है एक नया ColorDrawable - सुविधा देता है इसे कहते conceptual_drawable_cyan उस दृश्य के वर्ग के अंदर।अब जब एक ही दृश्य को एक अलग रंग का उपयोग कर प्रोग्राम के रूप में असाइन किया गया है: एक अलग drawable बनाने के बजाय इस दृश्य

view.setBackgroundColor(newColor); 

आंतरिक यह drawable_cyan को यह newColor सेट। इसलिए इस बिंदु के बाद से यदि आप कहीं भी उपयोग

android:background="@color/cyan" 

दृश्य वास्तव में newColor साथ conceptual_drawable_cyan का प्रयोग करेंगे।

समाधान:

इसके बजाय setBackgroundColor का उपयोग कर प्रोग्राम के रूप में रंग सेट करने के

, उपयोग:

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
     view.setBackground(new ColorDrawable(newColor)); 
    } else { 
     view.setBackgroundDrawable(new ColorDrawable(newColor)); 
    } 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^