2012-05-03 38 views
13

Tôi có một dự án Android mà tôi đang cố gắng thực hiện vào thư viện. Tôi nhận được một ngoại lệ ném vào mã này:Thư viện Android không kéo tài nguyên của mình qua các dự án khác

_buttonStart = (Button) findViewById(R.id.buttonStart); 

Ngoại lệ tôi nhận được là:

java.lang.NoSuchFieldError: com.xxx.libraryname.R$id.buttonStart 

Các tài liệu Android dường như rõ ràng nói rằng thư viện sẽ có thể truy cập vào các nguồn tài nguyên:

"Ví dụ, mã nguồn trong dự án thư viện có thể truy cập tài nguyên của chính nó thông qua lớp R của nó."

Khi tôi xem trong thư viện /gen/com.xxx.libraryname/R.java/R/id/, buttonStart có ở đó. Nhưng khi tôi nhìn vào dự án chính của /gen/com.xxx.libraryname/R.java/R/id, nó không phải là.

Tôi đã làm sạch.

+9

Đã tìm ra. Cả hai dự án đều có một tệp "main.xml". Đổi tên tệp main.xml của thư viện và mọi thứ đã hoạt động. –

+5

Có, nếu bạn có tài nguyên có tên giống nhau, dự án máy chủ sẽ thắng. Tốt nhất là cung cấp cho các thư viện tên tài nguyên duy nhất, có lẽ thông qua một số ký hiệu tiền tố, vì vậy không có xung đột tình cờ. Có thể có các xung đột * cố ý *, nơi máy chủ đang cố gắng thay thế tài nguyên, trong trường hợp máy chủ lưu trữ phải thực hiện theo cách mà thư viện sẽ chấp nhận (ví dụ: duy trì cùng một tiện ích với cùng ID cho bố cục). – CommonsWare

+1

@DanJameson Bạn cũng có thể thêm giải pháp vào phần câu trả lời không? – Anirudh

Trả lời

4

Dự án thư viện của bạn cũng có cùng một tệp main.xml bố cục làm dự án chính của bạn.

Android sẽ ưu tiên cho dự án lưu trữ nếu cả hai có cùng tên Bố cục, trong trường hợp này là "main.xml" Cách tiếp cận tốt nhất là sử dụng một số ký hiệu tiền tố để không có xung đột tình cờ.

+0

Greate Answer !!! –

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