2015-05-13 9 views
7

Tôi có một mô-đun ứng dụng chính cũng như một vài mô-đun thư viện.Tài nguyên tham khảo từ mô-đun khác trong Android Studio

Mô-đun thư viện của tôi có thể tham chiếu tài nguyên từ mô-đun ứng dụng chính như thế nào.

Ví dụ: Ứng dụng cơ bản của tôi có tệp colors.xml có mục màu được gọi là "AppPrimary" màu xanh lam.

Trong thư viện của tôi, tôi muốn có chế độ xem trong bố cục xml để tham chiếu màu @ color/AppPrimary, nhưng điều đó không hiệu quả.

Tôi làm cách nào để đạt được điều này?

Chỉnh sửa: Tôi nên chỉ định đây không phải là tài nguyên appCompat cụ thể. Chỉ các chuỗi/màu/kiểu chung chung trong mô-đun chính của tôi. Làm thế nào tôi có thể tham chiếu chúng trong cùng một dự án trong mô-đun thư viện của tôi colors.xml/strings.xml?

Trả lời

7

Trong mô-đun thư viện của bạn trong cách bố trí tham khảo xml ?attr/colorPrimary thay vì @color/AppPrimary

này tham khảo bảng màu thuộc tính từ chủ đề của ứng dụng. I E.;

<item name="colorPrimary">@color/AppPrimary</item> 

Bạn cũng có thể tham khảo bảng màu khác các thuộc tính như:

<item name="colorPrimaryDark">...</item> -> ?attr/colorPrimaryDark 
<item name="colorAccent">...</item> -> ?attr/colorAccent 

và vân vân.

Please refer to this documentation

caveat:
Những ví dụ tham khảo việc thực hiện AppCompat trong chủ đề. tức là không có tiền tố không gian tên android:.

- EDIT -

Câu trả lời ngắn gọn là bạn chỉ đơn giản là không thể 'get' một màu được xác định từ mô-đun chính của bạn tham chiếu đến thư viện của bạn colors.xml tập tin.

Tuy nhiên, bạn có thể tận dụng các thuộc tính được xác định tùy chỉnh trong chủ đề của mình để đạt được hiệu quả tương tự.

này hoạt động bằng cách tuyên bố một styleable chung trong tập tin attrs.xml của bạn trong module thư viện, Một cái gì đó như thế này:

<declare-styleable name="BaseTheme"> 
    <attr name="someColor" format="reference|color" /> 
</declare-styleable> 

Lưu ý: Tên của styleable không có mang về thi này để cảm thấy tự do để đặt tên nó bất cứ điều gì bạn muốn.

Sau đó, trong định nghĩa chủ đề module chính của bạn trong 'style.xml' của bạn hoặc tập tin 'theme.xml' bạn sẽ muốn thiết lập thuộc tính này để các màu sắc mà bạn muốn chia sẻ, như thế này:

<style name="Theme.Example" parent="Theme.AppCompat.Light.NoActionBar"> 

    <!-- Color Palette --> 
    <item name="colorPrimary">...</item> 
    <item name="colorPrimaryDark">...</item> 
    <item name="colorAccent">...</item> 

    <!-- Here we define our custom attributes --> 
    <item name="someColor">@color/dark_blue</item> 

</style> 

Khi điều này được xác định, bạn có thể tham chiếu thuộc tính trong mã XML mô-đun thư viện của mình. ví dụ.;

<TextView 
    ... 
    android:textColor="?attr/someColor" 
    /> 
+0

Tôi nên chỉ định những tài nguyên này không phải là tài nguyên appcompat. Nói chỉ một màu chung được định nghĩa trong mô-đun ứng dụng chính có tên là "dark_blue". Làm thế nào để có được màu dark_blue trong thư viện colors.xml của tôi? – AnnonAshera

+0

Tôi đã cập nhật câu trả lời cho bộ phần mềm tốt hơn trường hợp sử dụng của bạn. – r0adkll

+0

Cảm ơn r0adkl Tôi đã thay đổi cấu trúc dự án. Thay vào đó, tôi đã xác định một thư viện lõi chung mà tất cả các mô-đun (thư viện và ứng dụng cơ sở) có thể tham chiếu với màu ứng dụng/chuỗi thông dụng, v.v. – AnnonAshera

0

Dưới đây là cách bạn có thể nhận thuộc tính màu trong khi ở mô-đun thư viện theo lập trình.

@ColorInt 
public static int getAttributeColor(Context context, @AttrRes int colorAttribute) 
{ 
    int[] attrs = {colorAttribute}; 
    TypedArray ta = context.obtainStyledAttributes(attrs); 
    /*Get the color resourceID that we want (the first index, and only item, in the 
    attrs array). Use ContextCompat to get the color according to the theme. 
    */ 
    @ColorInt int color = ContextCompat.getColor(context, 
               ta.getResourceId(0, -1)); 
    // ALWAYS call recycle() on the TypedArray when you’re done. 
    ta.recycle(); 
    return color; 
} 

Ví dụ:

//Get the main applications ‘colorAccent' from the app’s color palette. 
int appAccentColor = Utility.getMarketAttributeColor(context, R.attr.colorAccent); 

//Get the color attribute your module made for the client app to define. 
int moduleAttrColor = Utility.getMarketAttributeColor(context, R.attr.moduleColorAttr); 

Note: Quá trình thu hồi thuộc tính cơ bản này áp dụng cho hầu hết các loại thuộc tính.

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