2011-11-17 28 views
12

tôi xác định sau drawable my_background_drawable.xml:Màu Danh sách nhà nước không được công nhận trong Shape 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> 

Và tôi cũng xác định sau màu danh sách nhà nước tài nguyên 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> 

Khi tôi đặt cho my_background_drawable làm nền đối với một số chế độ xem thì tôi không thể quan sát bất kỳ thay đổi nào về màu được xác định trong color_stateful.xml đối với hình dạng của tôi, trong khi trạng thái chế độ xem thực sự bị thay đổi (selector_png_drawable.xml là chỉ báo).

Tuy nhiên tất cả mọi thứ chỉ là tốt khi tôi sửa đổi của tôi my_background_drawable.xml theo cách sau:

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

Vậy là nó đúng là thông tin trạng thái màu sắc chỉ bị mất khi ColorStateList tài nguyên được sử dụng trong vòng một ShapeDrawable hoặc tôi đang làm nó sai rồi?

Trả lời

25

Không thể chuyển ColorStateList làm thuộc tính cho <solid> trong định nghĩa XML hoặc thuộc tính thực sự của <shape>. Thuộc tính này được thổi phồng ra khỏi XML dưới dạng tài nguyên Màu và sau đó được chuyển đến phương thức setColor() của Drawable, chỉ lấy một giá trị ARGB duy nhất.

Chỉ có một loại dụ có thể vẽ được thiết kế để chứa và hiển thị nhiều mục dựa trên trạng thái, và đó là StateListDrawable, đó là những gì bạn nhận được khi bạn thổi phồng một số <selector>. Tất cả các trường hợp Drawable khác có nghĩa là chỉ đơn giản là thành viên của bộ sưu tập này hoặc được vẽ độc lập.

Cũng lưu ý rằng mục <shape> tăng cao thực sự là GradientDrawable và không phải là ShapeDrawable. Nếu bạn kiểm tra phương thức inflate() của GradientDrawablein the source, bạn có thể nhận được tất cả chi tiết bạn có thể yêu cầu về cách sử dụng từng thuộc tính.

HTH!

+7

Kể từ Android Lollipop, điều này không còn đúng và 'ColorStateList' được phân tích cú pháp chính xác. – keyboardr

+1

Có thể xác nhận nó hoạt động trong Lollipop - đã thực sự bối rối tại sao thiết bị thử nghiệm <21 của tôi không hoạt động đúng cách! – Tom

+7

Sự thay thế rõ ràng (và khủng khiếp) đối với các thiết bị trước kẹo là tạo ra nhiều '' s vì có các trạng thái, mỗi loại chỉ khác nhau bởi thuộc tính '' 'màu' và thay thế' 'ban đầu một 'StateListDrawable' tham chiếu mỗi' '. Sự tàn bạo của vật có thể được giảm nhẹ bằng cách chỉ sử dụng các tham chiếu tài nguyên bên trong các phần tử '' (không có giá trị mã hóa cứng) và một phần tử có thể có '' ban đầu được giữ trong thư mục 'drawable-v21' (có thể đầy đủ) chuyển sang sau). _blargh_ – desseim

-4

Bạn đang làm nó vắt .... chỉ là Thay thế này

android:color="@color/color_stateful" 

với

android:background="@color/color_stateful" 

update:

trong mã chương trình của bạn trong 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

Không có thuộc tính nào như 'android: background' trong hình dạng có thể vẽ được –

2

Thực tế là bạn có thể chỉ định một ColorStateList làm màu đồng nhất bên trong xml của một shape ->GradientDrawable, nhưng đó chỉ là một new feature in Lollipop.

Older versions of GradientDrawable chỉ chấp nhận tài nguyên màu.

Hiện đang làm việc trên phương án thay thế nếu bạn quan tâm.

Các vấn đề liên quan