2015-05-13 3 views
7

Ich habe ein Haupt-App-Modul sowie ein paar Bibliotheksmodule.Referenz Ressourcen von anderen Modul in Android Studio

Wie kann mein Bibliotheksmodul Ressourcen aus dem Haupt-App-Modul referenzieren?

Zum Beispiel: Meine Basis-App hat eine colors.xml, die ein Farbelement namens "AppPrimary" hat, das blau ist.

In meiner Bibliothek möchte ich eine Ansicht in einem XML-Layout auf @ Farbe/AppPrimary Farbe verweisen, aber das funktioniert nicht.

Wie kann ich das erreichen?

Edit: Ich sollte angeben, dies ist nicht speziell appCompat Ressourcen. Nur generische Zeichenfolgen/Farben/Stile/in meinem Hauptmodul. Wie kann ich sie im selben Projekt in meinem Bibliotheksmodul colors.xml/strings.xml referenzieren?

Antwort

7

In Ihrem Bibliotheksmodul in der XML-Layout Referenz ?attr/colorPrimary statt @color/AppPrimary

Dies verweist auf die Farbpalette aus Ihrer App Themenattribute. d. h.

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

Sie auch auf die anderen Farbpalette Attribute wie verweisen:

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

und so weiter.

Please refer to this documentation

CAVEAT:
beziehen Diese Beispiele zeigen die AppCompat Implementierung in das Thema. d.h. nein android: Namespacepräfix.

- EDIT -

Die kurze Antwort ist, dass man einfach nicht ‚get‘ eine definierte Farbe aus dem Hauptmodul bezogen auf Ihre Bibliotheken Datei Colors.xml.

Sie können jedoch benutzerdefinierte definierte Attribute in Ihrem Design nutzen, um denselben Effekt zu erzielen.

Dies funktioniert durch eine generische styleable in Ihrer attrs.xml Datei im Bibliotheksmodul, So etwas wie dies zu erklären:

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

Hinweis: Der Name des styleable hat keinen Einfluss auf diese Implementierung so frei Name fühlen es was auch immer du willst.

Dann in Ihrem Hauptthema Definition des Moduls in Ihrem style.xml 'oder ‚theme.xml‘ Datei Sie dieses Attribut auf die Farbe festlegen möchten Sie teilen möchten, wie folgt aus:

<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> 

Sobald dies definiert ist, können Sie auf das Attribut in Ihrem Bibliotheksmodul-XML-Code verweisen. z.B.;

+0

Ich sollte angeben, dass dies nicht appcompat Ressourcen sind. Sprich es ist nur eine allgemeine Farbe, die im Haupt-App-Modul "dark_blue" definiert ist. Wie bekomme ich diese dark_blue Farbe in meine Bibliothek colors.xml? – AnnonAshera

+0

Ich habe die Antwort aktualisiert, um Ihrem Anwendungsfall besser zu entsprechen. – r0adkll

+0

Danke r0adkl Ich habe die Projektstruktur geändert. Stattdessen habe ich eine gemeinsame Kernbibliothek definiert, auf die alle Module (Bibliotheken und Basis-App) mit App-Farben/gemeinsamen Strings etc. verweisen können. – AnnonAshera

0

Gehen Sie folgendermaßen vor, um Farbattribute programmgesteuert in einem Bibliotheksmodul zu erhalten.

@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; 
} 

Bsp.

//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); 

Hinweis: Der einfache Attribut Abrufprozess gilt für meist Attributtypen.

Verwandte Themen