2010-08-15 39 views
50

Tôi đang cố gắng để tạo ra thuộc tính tuỳ chỉnh để nút của tôi nhưng tôi không biết định dạng tôi phải sử dụng hình ảnh trong tờ khai thuộc tính ...Format giá trị thuộc tính "android: drawable" không hợp lệ

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

    <declare-styleable name="TCButton"> 
     <attr name="Text" format="string"/> 
     <attr name="BackgroundImage" format="android:drawable" /> 
    </declare-styleable> 


</resources> 

Lỗi là trong định dạng = "android: drawable" ...

Trả lời

130

Bạn có thể sử dụng format = "integer", id nguồn của drawable, và AttributeSet.getDrawable (...).

Đây là một ví dụ.

Khai báo các thuộc tính như số nguyên trong res/values ​​/ attrs.xml:

<resources> 
    <declare-styleable name="MyLayout"> 
     <attr name="icon" format="integer" /> 
    </declare-styleable> 
</resources> 

Đặt thuộc tính id drawable trong cách bố trí của bạn:

<se.jog.MyLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    myapp:icon="@drawable/myImage" 
/> 

Lấy drawable từ thuộc tính trong lớp thành phần tiện ích tùy chỉnh của bạn:

ImageView myIcon; 
//... 
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyLayout); 
Drawable drawable = a.getDrawable(R.styleable.MyLayout_icon); 
if (drawable != null) 
    myIcon.setBackgroundDrawable(drawable); 

Để xem tất cả các tùy chọn có thể kiểm tra android src here

+0

xem lại điều này, có thể thêm rằng khai báo không gian tên bị lỗi sẽ không cung cấp lỗi thời gian biên dịch. Trong ví dụ này, nó có thể trông giống như 'xmlns: myapp =" http://schemas.android.com/apk/res/se.jog.mob "' nếu 'lớp MyLayout' được khai báo trong' se.jog.mob' . – JOG

+7

Bạn nên gọi 'a.recycle()' khi bạn sử dụng các thuộc tính được tạo kiểu. – karl

+0

Trong các dự án gradle, lược đồ tùy chỉnh phải luôn là "http://schemas.android.com/apk/res-auto" –

24

Tôi nghĩ rằng nó sẽ được tốt hơn để sử dụng nó như một tài liệu tham khảo đơn giản:

<declare-styleable name="TCButton"> 
     <attr name="customText" format="string"/> 
     <attr name="backgroundImage" format="reference" /> 
</declare-styleable> 

Và đặt nó trong xml của bạn như thế này:

<your.package.name.TCButton 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    custom:customText="Some custom text" 
    custom:backgroundImage="@drawable/myImage" 
/> 

Và trong lớp học của bạn thiết lập các thuộc tính như này:

public TCButton(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MembershipItemView, 0, 0); 

    String customText; 
    Drawable backgroundImage; 
    try { 
     customText = a.getString(R.styleable.TCButton_customText); 
     backgroundImage = a.getDrawable(R.styleable.TCButton_backgroundImage); 
    } finally { 
     a.recycle(); 
    } 

    if(!TextUtils.isEmpty(customText)) { 
     ((TextView)findViewById(R.id.yourTextView)).setText(customText); 
    } 

    if(null != backgroundImage) {      
     ((ImageView)findViewById(R.id.yourImageView)).setBackgroundDrawable(backgroundImage); 
    } 
} 

PS: Đừng quên thêm dòng này cho phần tử gốc của bố cục bạn đang sử dụng chế độ xem tùy chỉnh của mình trong

xmlns:custom="http://schemas.android.com/apk/res-auto" 

Nếu bạn không đặt, bạn sẽ không thể truy cập thuộc tính tùy chỉnh của mình.

+1

Cài đặt thuộc tính backgroundImage tùy chỉnh trong ví dụ của bạn là sai. Nhiều hơn như: tùy chỉnh: backgroundImage = "@ drawable/myImage" – gdakram

+0

Cảm ơn bạn @gdakram, tôi đã sửa câu trả lời. –

+0

Câu trả lời hay. Cảm ơn. – milosmns

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