2011-01-24 30 views
12

Tôi đang cố lập trình thuộc tính "android: checkMark" trên các mục CheckedTextView mà tôi có trong một ListView. Khi chạy ứng dụng của tôi tôi nhận được ngoại lệ sau đây:

android.content.res.Resources$NotFoundException: Resource ID #0x101021a 

Các tài nguyên với ID # 0x101021a tương ứng với android.R.attr.listChoiceIndicatorMultiple, đó chính là giá trị tôi đi qua để CheckedTextView tôi:

mCheckedTextView.setCheckMarkDrawable(android.R.attr.listChoiceIndicatorMultiple) 

Đây không phải là cách để làm điều đó từ Java? Tôi cố gắng (và thành công) để kích hoạt các hành vi mong muốn từ layout XML:

<CheckedTextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:checkMark="?android:attr/listChoiceIndicatorMultiple" 
    android:id="@android:id/text1" /> 

Cái này là tôi không biết tại thời gian biên dịch nếu nó phải được

android:checkMark="?android:attr/listChoiceIndicatorMultiple" 

hoặc

android:checkMark="?android:attr/listChoiceIndicatorSingle" 

Do đó, tôi cần đặt các giá trị này khi chạy.

+0

Cảm ơn! Điều đó đã giúp tôi rất nhiều với một vấn đề tôi đã có ngày hôm nay. – Chris

+0

@Chris: Bạn được chào đón :-) – dbm

Trả lời

26

Tôi đoán rằng lập trình thiết lập một tham chiếu thuộc tính chứ không phải là một tài liệu tham khảo Drawable là vấn đề.

Trong trường hợp này, android.R.attr.listChoiceIndicatorMultiplecorresponds toandroid.R.drawable.btn_check, vì vậy, bạn có thể thử thiết lập thay vào đó.


Hoặc, nếu bạn có thể lấy các thuộc tính, bạn có thể gọi getDrawable() trên TypedArray để tự động lấy giá trị Drawable.

Edit:
Kể từ khi giá trị của listChoiceIndicatorMultiple phụ thuộc vào chủ đề hiện tại, bạn cần phải hỏi các chủ đề hiện tại để giải quyết các tài liệu tham khảo:

int[] attrs = { android.R.attr.listChoiceIndicatorMultiple }; 
TypedArray ta = getContext().getTheme().obtainStyledAttributes(attrs); 
Drawable indicator = ta.getDrawable(0); 
view.setCheckMarkDrawable(indicator); 
ta.recycle(); 

Hãy chắc chắn để cache drawables, chứ không phải là biểu diễn thao tác này cho mọi mục trong ListView của bạn.

Đó chỉ là một ví dụ rất cơ bản, nhưng nó hoạt động với chủ đề mặc định. Tôi không chắc chắn chính xác những gì cần phải được thực hiện để giải quyết hoàn toàn attrs nếu bạn có chủ đề tùy chỉnh.

+0

Xin lỗi bạn đã đúng. Lỗi của tôi. – Beasly

+1

Đó là một câu trả lời thực sự tốt (vì tôi đã đi xuống con đường đó :-), tuy nhiên, nó có vẻ như không có "android.R.drawable.btn_check" drawable.Nếu tôi duyệt qua hệ thống tệp, tôi thực sự tìm thấy nó (nó nằm trong thư mục "[path_to_android_SDK]/platform/android-9/data/res/drawable" và nó là tệp XML), nhưng khi viết mã của tôi, tôi nhận được lỗi biên dịch phàn nàn về "btn_check không thể được giải quyết hoặc không phải là một trường hợp lệ". – dbm

+0

Các gợi ý khác (một trong những về "getDrawable()") là, tuy nhiên, mới với tôi. Tôi sẽ phải làm một số "bài tập về nhà" trên đó mặc dù, kể từ khi tôi đã không làm như vậy một cơ động trước :-) – dbm

0

Nếu sử dụng thư viện appcompat lựa chọn thay thế đơn giản sẽ là:

setCheckMarkDrawable(android.support.v7.appcompat.R.drawable.abc_btn_check_material); 

hay:

setCheckMarkDrawable(android.support.v7.appcompat.R.drawable.abc_btn_radio_material); 
Các vấn đề liên quan