2012-07-26 26 views
13

Tôi có một bộ chọn có thể kéo làm nền cho mỗi mục trong một ListView để làm nổi bật hàng đã chọn. Eveything hoạt động tốt trong Ice Cream Sandwich, nhưng dường như không hoạt động trong Jelly Bean. Không thể tìm thấy bất kỳ tài liệu nào nói rằng những thay đổi nào có thể đã khiến nó ngừng hoạt động và những gì tôi cần làm để khắc phục.Bộ chọn có thể vẽ không hoạt động trong Jelly Bean

Bằng cách không hoạt động, ý tôi là khi tôi nhấp vào một hàng ở ListView, màu nền của mặt hàng không chuyển màu @color/blue, nhưng nó có trong ICS.

Đây là mã selector Tôi đang sử dụng (listing_selector.xml):

<selector xmlns:android="http://schemas.android.com/apk/res/android" > 

    <item android:state_focused="true" android:drawable="@color/blue" /> 

    <item android:state_pressed="true" android:drawable="@color/blue" /> 

    <item android:state_activated="true" android:drawable="@color/blue_selected" /> 

    <item android:state_selected="true" android:drawable="@color/blue_selected" /> 

    <item android:drawable="@android:color/transparent" /> 

</selector> 

Đây là cách bố trí của các ListView mục:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" 
    android:background="@color/listing_selector"  
> 

    <TextView 
     android:id="@+id/text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
    /> 

</RelativeLayout> 

này tài nguyên màu xanh:

<resources> 
    <color name="blue">#ff33b5e5</color>  
</resources> 

CẬP NHẬT 1:

Cố gắng di chuyển chọn từ thư mục color vào thư mục drawable và cập nhật các mã này:

android:background="@drawable/listing_selector" 

UPDATE 2:

Ngoài ra, trên ListView, thử thêm này:

<ListView android:id="@android:id/list" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:listSelector="@drawable/listing_selector" 
    /> 

CẬP NHẬT 3:

Tôi nghĩ rằng đó có thể là một cái gì đó trong mã của tôi, nhưng tôi đã xóa tất cả mã khỏi onListItemClick của ListView và vẫn là selector không hoạt động.

CẬP NHẬT 4:

tôi đã thu hẹp nó xuống để state_selected hoặc state_activated không làm việc như, state_pressed dường như được làm việc

CẬP NHẬT 5:

Tôi nghĩ rằng tôi đã nhầm lẫn . Tôi không nghĩ rằng bộ chọn được công nhận, ở tất cả. Tôi đã nhầm lẫn việc đánh dấu tích hợp ListView làm công cụ chọn của tôi. Tôi đang tự hỏi nếu nó có cái gì để làm với cách dự án của tôi được thiết lập. Tôi có bộ chọn trong một lớp thư viện. Có lẽ một cái gì đó thay đổi với điều đó từ ICS để JB, tuy nhiên di chuyển bộ chọn để dự án ứng dụng của tôi dường như không sửa chữa nó.

CẬP NHẬT 6:

Ok, sau khi một số tóc hơn kéo, tôi đã thu hẹp nó xuống, một lần nữa, hoặc là state_selected hoặc state_activated không được công nhận, như thay đổi màu sắc cho state_pressed làm việc, điều đó có nghĩa công cụ chọn của tôi đang được công nhận. Từ các ý kiến ​​trong có vẻ là một cái gì đó với ứng dụng của tôi đặc biệt là những người khác đã có thể có được bộ chọn làm việc với Jelly Bean.

Mặc dù điều gì đó thú vị khác là việc thay đổi giá trị drawable cho trạng thái mặc định không được nhận dạng. Nơi tôi có color/transparent, tôi sẽ nghĩ rằng việc thay đổi màu đó sẽ khiến danh sách thay đổi thành màu đó, nhưng không.

Ngoài ra, tính năng này cũng không hoạt động trong ICS.

CẬP NHẬT 7:

Sau tóc thậm chí nhiều hơn kéo, tôi đã phát hiện ra rằng lâu nhấn và giữ một kết quả mục trình đơn trong màu của mục mà được thay đổi. Chỉ cần nhấp vào một mục vẫn không hoạt động. Thậm chí không chắc chắn về phương tiện.

** Cập nhật cuối cùng: **

tôi bỏ cuộc, tôi loại bỏ các selector và sáng chỉ làm mới ListView nhấp chuột và ghi nhớ vị trí nhấp và làm nổi bật nó từ mã. Không lý tưởng, nhưng không đáng để cố gắng sửa chữa.

+0

Khi bạn thử UPDATE 2, bạn đã xóa android: background khỏi mục danh sách của mình. Tôi sử dụng android: listSelector cho danh sách và sau đó không có android: background được định nghĩa cho mục danh sách; và mọi thứ đều hiệu quả với tôi. Ngoài ra, tôi không chắc chắn nếu nó liên quan nhưng tôi cũng có android: cacheColorHint = "@ null". – Chris

+0

@ Chris Yea, đã cố gắng không hoạt động. Tôi đã thêm bản cập nhật mới (# 5). Tôi tự hỏi nếu vấn đề là với cách tôi có thiết lập dự án của tôi? –

+0

Thiết lập dự án sẽ không liên quan đến vấn đề này giả sử bạn có phụ thuộc Android của bạn hiển thị .... nhật thực về cơ bản buộc bạn phải làm. Mẹo về điều màu sắc có thể drawable, sử dụng android: color cho bộ chọn xml trong res/color và android: drawable cho bộ chọn xml trong res/drawable. Đối với những gì bạn có có lẽ không có lý do để sử dụng nó như là một drawable chứ không phải là một màu sắc. Và màu sắc hoàn toàn có độ mờ đục đầy đủ, vì vậy # ff33b5e5 giống như # 33b5e5 – syklon

Trả lời

1

listing_selector.xml phải res/drawable thư mục và thiết lập android:background thuộc tính của RelativeLayout của bạn như thế này:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" 
    android:background="@drawable/listing_selector"  
> 
+0

Đã di chuyển 'listing_selector.xml' sang thư mục' res/drawable', nhưng vẫn không hoạt động. –

+0

@KrisB K_Anas đang nhấn mạnh dòng này: '@ drawable/listing_selector'. –

+0

@SherifelKhatib không chắc chắn ý bạn là gì. Tôi đã chuyển 'listing_selector.xml' thành' res/drawable' và thay đổi dòng mã đó thành từ 'android: background =" @ color/listing_selector "' thành 'android: background =" @ drawable/listing_selector "'. Tôi có thiếu cái gì khác không? –

0

tôi không thể nói lý do tại sao làm việc của mình trong một phiên bản và không làm việc trong khác, nhưng tôi có một lựa chọn dung dịch.

Xác định màu sắc của bạn như một drawable tài nguyên

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <drawable name="blue">#00F</drawable> 
    ... 
</resources> 

Sử dụng màu drawable này trong chọn của bạn

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" android:drawable="@drawable/blue" /> 
    ... 
    ... 
</selector> 

Hãy thử điều này và cho tôi biết.

2

OK, tôi nghĩ rằng đó là vấn đề với bộ chọn của bạn. Thử xóa state_focused và state_activated. Bạn có thể thử điều này cho chọn của bạn:

<!-- Disabled State --> 
<item 
    android:state_enabled = "false" 
    android:state_focused = "true" 
    android:state_pressed = "true" 
    android:drawable="@android:color/transparent"> 
</item> 
<item 
    android:state_enabled = "false" 
    android:state_focused = "true" 
    android:drawable="@android:color/transparent"> 
</item> 

<!-- Pressed State --> 
<item 
    android:state_pressed = "true" 
    android:state_focused = "true"> 
    <shape> 
     <solid android:color="@color/blue"/> 
    </shape> 
</item> 
<item 
    android:state_pressed = "true" 
    android:state_focused = "false"> 
    <shape> 
     <solid android:color="@color/blue"/> 
    </shape> 
</item> 

<!-- Normal State --> 
<item 
    android:drawable="@android:color/transparent"> 
</item> 

tôi thấy rằng tôi cần thiết để sử dụng một đối tượng hình quá thay vì android:drawable, bởi vì trên điện thoại trước ICS, the whole list sẽ được nhấn mạnh rằng màu sắc thay vì danh sách ép mục.

Bạn cũng có thể thêm mã số state_selected của mình, nhưng tôi không chắc chắn nó sẽ được sử dụng như thế nào. Kiểm tra mã chọn mặc định cho đậu thạch cho các tiểu bang mà họ sử dụng: list_selector_background.xml.

0

Tôi nghĩ nó hoạt động tốt !!

chọn mã tập tin xml của bạn: -

<?xml version="1.0" encoding="utf-8"?> 
    <selector xmlns:android="http://schemas.android.com/apk/res/android"> 

     <item android:drawable="@color/gray" android:state_focused="true"/> 
     <item android:drawable="@color/gray" android:state_pressed="true"/> 
     <item android:drawable="@color/orange" android:state_activated="true"/> 
     <item android:drawable="@color/orange" android:state_selected="true"/> 
     <item android:drawable="@color/orange"/> 

    </selector> 

nay tạo một thư mục giá trị-v16 dưới thư mục res và copy file màu sắc này trong đó.

<?xml version="1.0" encoding="utf-8"?> 
<resources> 

    <color name="gray">#4f4f4f</color> 
    <color name="orange">#e26c0e</color> 

</resources> 

và sau đó listview:

<ListView 
     android:id="@+id/listView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_marginTop="20dp" 
     android:listSelector="@drawable/listing_selector" > 
</ListView> 

Hope làm việc này! Thử nghiệm trên phiên bản 4.1

+0

sự khác biệt duy nhất tôi thấy là tôi đã đặt tệp màu dưới giá trị-v16. – Chandrashekhar

+0

Cảm ơn, phải có điều gì đó sai trái với cách dự án của tôi được thiết lập, vì vậy tôi không nghĩ gì thay đổi trong Jelly Bean. Tuy nhiên vẫn cần phải làm việc thông qua nó. –

0

Từ API Docs:

Lưu ý: Hãy nhớ rằng Android áp dụng mục đầu tiên trong danh sách nhà nước phù hợp với tình trạng hiện tại của đối tượng. Vì vậy, nếu mục đầu tiên trong danh sách không chứa thuộc tính trạng thái nào ở trên, thì nó là áp dụng mọi lúc, đó là lý do giá trị mặc định của bạn luôn là cuối cùng (như được minh họa trong ví dụ sau).

Vì vậy, hãy thử sắp xếp lại trạng thái của bộ chọn theo thứ tự được đề xuất. Trong trường hợp của bạn có thể là:

<selector xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:state_pressed="true" android:drawable="@color/blue" /> 
    <item android:state_focused="true" android:drawable="@color/blue" /> 
    <item android:state_selected="true" android:drawable="@color/blue_selected" /> 
    <item android:state_activated="true" android:drawable="@color/blue_selected" /> 
    <item android:drawable="@android:color/transparent" /> 
</selector> 
Các vấn đề liên quan