2011-11-17 11 views
12

Mi definisco seguente drawable my_background_drawable.xml:colori Lista Stato non riconosciuto in forma 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> 

E ho anche definisco seguente colore elenco dello stato delle risorse 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> 

quando ho impostato dato my_background_drawable come sfondo per alcuni punti di vista quindi non posso osservare alcun cambiamento di colore definito in color_stateful.xml per la mia forma, mentre lo stato della vista è effettivamente cambiato (selector_png_drawable.xml è un indicatore).

Comunque tutto è bene quando modifico la mia my_background_drawable.xml nel seguente modo:

<?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> 

Quindi è vero che le informazioni sullo stato di colore è appena perso quando ColorStateList risorsa è utilizzata all'interno di un ShapeDrawable o sto facendo sbagliato?

risposta

25

Non è possibile passare un ColorStateList come attributo per <solid> in una definizione XML o in realtà qualsiasi attributo di uno <shape>. Questo attributo viene gonfiato dall'XML come risorsa colore e quindi passato al metodo setColor() del Drawable, che accetta solo un singolo valore ARGB.

Esiste un solo tipo di istanza Drawable progettata per contenere e presentare più elementi in base allo stato, ovvero StateListDrawable, che è ciò che si ottiene quando si gonfia uno <selector>. Tutte le altre istanze disegnabili sono pensate per essere semplicemente membri di questa raccolta o disegnate separatamente.

Si noti inoltre che un articolo gonfiato <shape> è in realtà un GradientDrawable e non un ShapeDrawable. Se si controlla il metodo inflate() di GradientDrawablein the source, è possibile ottenere tutti i dettagli che si possono chiedere su come viene utilizzato ciascun attributo.

HTH!

+7

A partire da Android Lollipop, questo non è più true e 'ColorStateList' viene analizzato correttamente. – keyboardr

+1

Posso confermare che funziona in Lollipop - ero davvero confuso perché il mio dispositivo di test <21 non funzionava correttamente! – Tom

+7

L'ovvia (e orrenda) alternativa per i dispositivi pre-lecca-lecca è creare tanti ' come ci sono stati, ognuno solo differendo dal loro' '' color' attributo, e sostituire l'originale '' da un 'StateListDrawable' che fa riferimento a ciascun' '. L'atrocità della cosa può essere leggermente mitigata usando solo i riferimenti alle risorse all'interno degli elementi '' '(nessun valore hardcoded), e si può anche avere l'originale '' tenuto nella directory 'drawable-v21' (eventualmente completamente passare a più tardi). _blargh_ – desseim

-4

Lo state facendo strizzare .... basta sostituire questo

android:color="@color/color_stateful" 

con

android:background="@color/color_stateful" 

aggiornamento:

nel codice programma nel 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

Non esiste un attributo come 'android: background in shape drawable –

2

In effetti tu è possibile assegnare un ColorStateList come un colore solido all'interno del xml di un a shape ->GradientDrawable, ma questo è solo un new feature in Lollipop.

Older versions of GradientDrawable accettano solo le risorse di colore.

Attualmente si sta lavorando su un'alternativa compatibile se si è interessati.