2012-03-16 24 views
6

Tôi đã làm việc trên một Custom Control cho Android và mặc dù tôi đã cố gắng làm những gì được đề xuất here dường như có điều gì đó tôi đang làm sai.Android Custom Control namespace issue

Dưới đây là mã của tôi để xem có ai có thể nhận ra vấn đề:

MyComponent.java

public MyComponent(Context context, AttributeSet attrs) 
{ 
    super(context); 
    TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.MyComponent); 
    CharSequence myId = arr.getString(R.styleable.MyComponent_identifier); 

    if (myId != null) 
    { 
    this.setIdentifier(myId.toString()); 
    } 

    Integer cds = arr.getInteger(R.styleable.MyComponent_cd_number, 0); 

    if(cds != null) 
    { 
    this.setCds(cds); 
    } 

    arr.recycle(); 
} 

attrs.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="MyComponent">  
    <attr name="cd_number" format="integer" /> 
    <attr name="identifier" format="string" /> 
    </declare-styleable> 
</resources> 

main.xml

<TableLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:bgl="http://schemas.android.com/apk/res/my.test.package.components" 
    android:id="@+id/table" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    ... 

    <my.test.package.MyComponent 
    android:id="@+id/hand" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_span="2" 
     bgl:cd_number="4" 
     bgl:identifier="plr"/> 

    ... 

    </TableLayout> 

Khi tôi đặt này tôi nhận được các lỗi sau đây:

lỗi: Không có định danh tài nguyên tìm thấy cho thuộc tính 'cd_number' trong gói 'my.test.package' lỗi: Không có định danh tài nguyên tìm thấy cho thuộc tính 'nhận dạng' trong gói 'my.test.package'

Nếu tôi thay đổi không gian tên của tôi để cái gì đó như:

xmlns:bgl="http://schemas.mywhatever.com/apk/res/my.test.package" 

... các lỗi đi w ay và điều chạy nhưng myId là null và cds là 0 (giá trị mặc định!) trở lại trên hàm tạo MyComponent.java.

Tôi muốn nói đó là một số sai lầm rất cơ bản nhưng tôi không thể phát hiện ra nó và vì không có nhiều tài liệu về điều này, tôi quyết định hỏi tại đây.

Cảm ơn trước!

Trả lời

14

Ok. Tôi đã giải quyết nó!

Trên bài đăng ban đầu tôi đã:

xmlns:bgl="http://schemas.android.com/apk/res/my.test.package 

... nhưng trong mã nguồn của tôi, tôi có:

xmlns:bgl="http://schemas.android.com/apk/res/my.test.package.components 

... bởi vì tôi nghĩ người ta nên đặt URI để gói các thành phần .

ĐÂY LÀ SAU!

Trên xmlns nó phải là tên ứng dụng như được khai báo trên Tệp kê khai!

Khi tôi loại bỏ phần "thành phần" của xmlns nó "khớp" tên ứng dụng trong Tệp kê khai và các lỗi đã biến mất và khi tôi chạy điều trong gỡ lỗi, tôi thực sự có thể thấy các giá trị tôi đã chuyển đến tham số trong XML!

Hy vọng điều này sẽ giúp người khác! :-)

CẬP NHẬT

Sau đó tôi có nhu cầu di chuyển sự kiểm soát vào một thư viện và phải đối mặt với vấn đề một lần nữa. Dường như khi bạn đặt các thành phần trong thư viện và sử dụng nó trên một ứng dụng client bạn phải khai báo xmlns như sau:

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

Nếu bạn làm như vậy (và có thư viện khai báo là một sự phụ thuộc Android) Eclipse (hoặc là Android?) sẽ tìm kiếm các phụ thuộc cho các ràng buộc thuộc tính thích hợp.

+1

Công việc tuyệt vời nghiên cứu và cung cấp câu trả lời. sửa lỗi tự động sửa là chính xác những gì tôi cần. – AlanKley

+0

'tự động định lại'. Bạn đẹp! – darksider474

+0

bgl và myns là gì, làm cách nào tôi có thể đặt tên đó – Nepster

0

Tôi đã có một vấn đề tương tự như sau, hóa ra nó được gọi một constructor khác nhau

Hãy thử với các nhà xây dựng mà mất trong các tham số defStyle

public MyComponent(Context context, AttributeSet attrs, int defStyle) 
+0

Cảm ơn, kích hoạt. Thật không may vấn đề của tôi có vẻ là một vấn đề khác. Tôi xác định các ctor bạn đề nghị và nếu tôi không thay đổi không gian tên lỗi vẫn tồn tại. Nếu tôi thay đổi xmlns nó sẽ hoạt động giống nhau: ctor mới không bao giờ được gọi và myId là null và cds là 0 như trước đây. Ý tưởng khác nhau? Bất kỳ ai? –