2011-11-17 17 views
12

मैं drawable my_background_drawable.xml निम्नलिखित को परिभाषित:रंग राज्य सूची आकार Drawable में मान्यता प्राप्त नहीं

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item> 
     <shape android:gravity="center" 
      android:shape="rectangle"> 
      <solid android:color="@color/color_stateful" /> 
     </shape> 
    </item> 

    <item android:drawable="@drawable/selector_png_drawable" /> 
</layer-list> 

और मैं भी रंग राज्य सूची संसाधन color_stateful.xml निम्नलिखित को परिभाषित:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:state_pressed="true" android:color="#FF00ff00"/> 
    <item android:color="#FFff0000"/> 
</selector> 

जब मैं एक पृष्ठभूमि के रूप में my_background_drawable दिए गए सेट कुछ दृश्यों के लिए मैं अपने आकार के लिए color_stateful.xml में परिभाषित रंग में कोई भी परिवर्तन नहीं देख सकता, जबकि दृश्य स्थिति वास्तव में बदल जाती है (selector_png_drawable.xml एक संकेतक है)।

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
<!-- This doesn't work 
    <item> 
     <shape android:gravity="center" 
      android:shape="rectangle"> 
      <solid android:color="@color/color_stateful" /> 
     </shape> 
    </item> 
--> 
    <item> 
     <selector xmlns:android="http://schemas.android.com/apk/res/android"> 
      <item android:state_pressed="true"> 
       <shape android:gravity="center" 
        android:shape="rectangle"> 
        <solid android:color="#FF00ff00" /> 
       </shape> 
      </item> 

      <item> 
       <shape android:gravity="center" 
        android:shape="rectangle"> 
        <solid android:color="#FFff0000" /> 
       </shape> 
      </item> 
     </selector> 
    </item> 

    <item android:drawable="@drawable/selector_png_drawable"" /> 
</layer-list> 

तो यह सच है कि रंग राज्य सूचना जब ColorStateList संसाधन एक ShapeDrawable भीतर प्रयोग किया जाता है खो दिया है या मैं इसे कर रहा हूँ है:

हालांकि सब कुछ जब मैं निम्नलिखित तरीके से मेरी my_background_drawable.xml संशोधित ठीक है गलत?

उत्तर

25

ColorStateList किसी XML परिभाषा में <solid> के लिए एक विशेषता के रूप में पारित नहीं किया जा सकता है, या वास्तव में <shape> की कोई विशेषता नहीं है। इस विशेषता को एक्सएमएल से रंग संसाधन के रूप में बाहर निकाला जाता है और फिर ड्रायबल के setColor() विधि को पास किया जाता है, जो केवल एक एआरजीबी मान लेता है।

केवल एक प्रकार का ड्रायबल उदाहरण है जिसे राज्य के आधार पर कई आइटमों को शामिल और प्रस्तुत करने के लिए डिज़ाइन किया गया है, और यह StateListDrawable है, जो आपको <selector> को बढ़ाते समय मिलता है। अन्य सभी ड्राइटेबल उदाहरण केवल इस संग्रह के सदस्य या तैयार स्टैंडअलोन के लिए हैं।

यह भी ध्यान दें कि <shape> आइटम एक GradientDrawable है और ShapeDrawable नहीं है। यदि आप GradientDrawablein the source की विधि देखते हैं, तो आप प्रत्येक विवरण का उपयोग करने के तरीके के बारे में पूछ सकते हैं कि आप सभी विवरण प्राप्त कर सकते हैं।

एचटीएच!

+7

एंड्रॉइड लॉलीपॉप के रूप में, यह अब सत्य नहीं है और 'ColorStateList' सही ढंग से पार्स किया गया है। – keyboardr

+1

यह पुष्टि कर सकता है कि यह लॉलीपॉप में काम करता है - वास्तव में उलझन में था कि मेरा <21 टेस्ट डिवाइस ठीक से काम क्यों नहीं कर रहा था! – Tom

+7

प्री-लॉलीपॉप उपकरणों के लिए स्पष्ट (और भयानक) विकल्प है क्योंकि राज्य हैं क्योंकि 'राज्य हैं, प्रत्येक व्यक्ति केवल उनके '' 'रंग' विशेषता से भिन्न होता है, और मूल' ' को आकर्षित करता है प्रत्येक '' संदर्भित 'स्टेटलिस्ट ड्रायबल'। '' तत्वों (कोई हार्ड-कोडेड मान) के अंदर केवल संसाधन संदर्भों का उपयोग करके चीज़ की अत्याचार को थोड़ा कम किया जा सकता है, और किसी को '''' drawable-v21' निर्देशिका में रखा जा सकता है (संभवतः पूरी तरह से बाद में स्विच करें)। _blargh_ – desseim

-4

आप इसे मरोड़ कर रहे हैं .... बस बदलें इस

android:color="@color/color_stateful" 

android:background="@color/color_stateful" 

अद्यतन के साथ:

my_background_drawable.xml में अपने प्रोग्राम कोड में

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item> 
     <shape android:gravity="center" 
      android:shape="rectangle"> 
      <solid android:background="@color/color_stateful" /> <!--this is the chanage i made... here--> 
     </shape> 
    </item> 

    <item android:drawable="@drawable/selector_png_drawable" /> 
</layer-list> 
+1

आकार में आकार में 'एंड्रॉइड: पृष्ठभूमि' जैसी कोई विशेषता नहीं है –

2

वास्तव में आप को shape ->GradientDrawable के xml के अंदर एक ठोस रंग के रूप में असाइन कर सकते हैं, लेकिन यह केवल new feature in Lollipop है।

Older versions of GradientDrawable केवल रंग संसाधन स्वीकार करते हैं।

यदि आप रुचि रखते हैं तो वर्तमान में एक कंपैट विकल्प पर काम कर रहे हैं।

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