2011-01-19 26 views
16

là có thể sử dụng các tài nguyên như chuỗi được xác định trong các dự án thư viện trong các dự án ứng dụng không? nếu vậy, làm thế nào? vì tôi không thể dường như để giải quyết các dây tôi muốn giải quyết như thế này:các tài nguyên nhập từ Android từ dự án thư viện

String title = "sample"; 
int id = ressources.getIdentifier(title, "string", "com.package"); 

mang lại cho tôi ngoại lệ này

WARN/ResourceType (278): Không nhận dạng gói khi nhận được giá trị cho số tài nguyên 0x00000000 WARN/System.err (278): android.content.res.Resources $ NotFoundException: ID tài nguyên chuỗi # 0x0

chuỗi ("mẫu") mà tôi đang tìm là chắc chắn trong gói này được cung cấp trong strings.xml của dự án thư viện. tôi thậm chí có thể nhìn thấy nó trong R.java

+0

được com.package gói được định nghĩa trong dự án thư viện của bạn AndroidManifest.xml –

+0

có nó được. tất cả các lớp đều nằm trong gói này. – clamp

Trả lời

14

Vì vậy, nó trông giống như

int id = ressources.getIdentifier (tựa đề, "chuỗi", "com.package");

đang quay lại 0, có nghĩa là nó không thể tìm thấy tài nguyên được chỉ định. Cuộc gọi tiếp theo tới ressources.getIdentifer() gây ra ngoại lệ, vì 0 không phải là id tài nguyên hợp lệ.

Dưới đây là một số debug/ý tưởng thay thế:


  • Có thể bạn đã làm điều này hàng chục lần, nhưng nó không làm tổn thương nhắc đến: đầu tiên kiểm tra lại chính tả của tất cả mọi thứ:

    • chính tả gói là chính xác (cả trong dự án thư viện và dự án khách hàng),
    • chuỗi tài nguyên là chính xác (dự án thư viện và dự án khách hàng),
    • là thư viện đúng chính tả trong uses-library phần tử AndroidManifest.xml,
    • , vv

  • Bạn có thể truy cập vào bất kỳ tài nguyên trong thư viện đó hoặc là vấn đề cụ thể để tài nguyên (title) hoặc là cụ thể cho loại tài nguyên (chuỗi)?Bạn có thể truy cập tài nguyên của thư viện khác không?

  • Bạn đang truy cập vào thư viện như là một file jar? Bạn có thể tạo mã, nhưng bạn không thể truy cập tài nguyên từ một cái bình.

Android - Is it possible to create a custom library to use across several applications?


  • Bạn có cố gắng định dạng tên thay thế:

String fullyQualifiedResourceName = "com.package:string/sample"; 
int id = ressources.getIdentifier(title, null, null); 
if (id == 0) { 
    Log.e(TAG, "Lookup id for resource '"+fullyQualifiedResourceName+"' failed"; 
    // graceful error handling code here 
} 

  • Bạn có thể thử sử dụng phản ánh:

final String resourceName= "sample"; 
final int id; 
try { 
    final Class resourceType = com.package.R.string.class; 
    final Field field = resourceType.getField(title); 
    id = field.getInt(null); 
} catch (final Exception e) { 
    Log.e(TAG, "Lookup id for resource '"+resourceName+"' failed"; 
    // graceful error handling code here 
} 

Android, getting resource ID from string?

http://daniel-codes.blogspot.com/2009/12/dynamically-retrieving-resources-in.html

+1

cảm ơn câu trả lời chi tiết của bạn! thư viện tôi đang sử dụng không phải là một cái lọ, nó chỉ là một dự án khác trong nhật thực mà tôi đã tham chiếu bằng cách sử dụng các thuộc tính dự án android. sử dụng phiên bản có tên đầy đủQualifiedResourceName cho cùng một lỗi. – clamp

+1

phiên bản với sự phản ánh đã không hoạt động nhưng tôi vẫn muốn hiểu lý do tại sao 'chính thức' không có. – clamp

+0

@clamp - rất thú vị! –

0

Có, xác định tài nguyên trong dự án thư viện của bạn như bình thường. Sau đó, tham khảo chúng trong dự án nhập thư viện bằng cách thêm vào lớp R với tên gói trong tệp AndroidManifest.xml của thư viện.

+0

ok, nhưng nếu tôi muốn lấy chuỗi với hàm getResources(). GetString (int id) – clamp

+0

Chính xác nó giống như sử dụng lớp R tiêu chuẩn, getResources(). GetSTring (R.string.somestringyouwanttouse) –

+0

thanks , thực sự bình luận trước của tôi là sai. tôi đang cố gắng tìm id theo tên của nó. bây giờ tôi đã sửa bài viết gốc của mình. – clamp

3

Trong mã dự án của bạn, nhập khẩu các lớp R:

import com.application.libraryproject.R

Sau đó, bạn có thể tham khảo bất kỳ chuỗi hoặc nguồn xml định nghĩa khác như thế này:

String mystring = getString(R.string.app_name);

hoặc tương đương.

+0

cảm ơn, thực sự câu hỏi của tôi là sai. vấn đề của tôi là infact để có được id của ressource, mà tôi cố gắng tìm bằng cách sử dụng getIdentifier và tên của nó. – clamp

2

Tôi đã có một vấn đề tương tự và tôi giải quyết nó bằng phương pháp getPackageName() trong Dự án Thư viện .

Trong trường hợp của bạn, nó phải là:

String title = "sample"; 
int id = ressources.getIdentifier(title, "string", getPackageName()); 
+0

Cảm ơn câu trả lời đó, nó đã giúp! –

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