2011-11-17 10 views
12

zdefiniować następujące rozciągliwej my_background_drawable.xml:Kolor Lista członkowskie nie rozpoznał w kształcie rozciągliwej

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

I również zdefiniować następujące państwowego koloru liście zasobów 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> 

kiedy ustawić dany my_background_drawable jako tło dla niektórych widoków nie widzę żadnej zmiany koloru zdefiniowanej w color_stateful.xml dla mojego kształtu, podczas gdy stan widoku jest faktycznie zmieniony (selector_png_drawable.xml jest wskaźnikiem).

Jednak wszystko jest w porządku, kiedy Zmienić my_background_drawable.xml w następujący sposób:

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

Więc to prawda, że ​​informacje o stanie kolor jest tylko utracone podczas ColorStateList zasób jest wykorzystywany w ShapeDrawable czy to robię źle?

Odpowiedz

25

A ColorStateList nie można przekazać jako atrybutu dla <solid> w definicji XML ani naprawdę żadnego atrybutu <shape>. Ten atrybut jest zawyżony w XML jako zasób koloru, a następnie przekazany do metody Drawable, która pobiera tylko jedną wartość ARGB.

Istnieje tylko jeden typ instancji do rysowania, która ma zawierać i przedstawiać wiele elementów w zależności od stanu, a jest to StateListDrawable, co można uzyskać po nadmuchaniu <selector>. Wszystkie inne instancje Szuflady mają po prostu być członkami tej kolekcji lub narysowanymi osobno.

Należy również zauważyć, że zawyżony element <shape> jest w rzeczywistości GradientDrawable, a nie ShapeDrawable. Jeśli wyewidencjonujesz metodę inflate() z GradientDrawablein the source, możesz uzyskać wszystkie szczegóły, o które możesz zapytać, w jaki sposób używasz każdego z atrybutów.

HTH!

+7

Od Androida Lollipop nie jest to już prawdą, a 'ColorStateList' jest poprawnie przetwarzany. – keyboardr

+1

Potwierdzam, że działa w Lollipop - był naprawdę zdezorientowany, dlaczego moje urządzenie testowe <21 nie działa poprawnie! – Tom

+7

Oczywistą (i przerażającą) alternatywą dla urządzeń pre-Lollipop jest utworzenie wielu '' s, ponieważ są stany, z których każdy różni się jedynie ich '' 'atrybutem' i zastępuje oryginalny '' rysowany przez a 'StateListDrawable' odnoszące się do każdego' '. Okrucieństwo obiektu można nieco złagodzić, wykorzystując jedynie odwołania do zasobów wewnątrz elementów '' (bez wartości zakodowanych na stałe), a także można mieć oryginalny katalog '' przechowywany w katalogu 'drawable-v21' (aby możliwie w pełni przełącz na później). _blargh_ – desseim

-4

robisz to załamują .... po prostu zastąpić ten

android:color="@color/color_stateful" 

z

android:background="@color/color_stateful" 

aktualizacji:

w kodzie programu w 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

Nie ma takiego atrybutu jak "android: tło w kształcie do rysowania –

Powiązane problemy