2015-05-13 14 views
7

Possiedo un modulo dell'app principale e alcuni moduli di libreria.Risorse di riferimento da altri moduli in Android Studio

In che modo il modulo Libreria può fare riferimento alle risorse dal modulo App principale.

Ad esempio: La mia app di base ha un colors.xml che ha un oggetto di colore chiamato "AppPrimary" che è blu.

Nella mia libreria voglio una vista in un layout xml per fare riferimento al colore @ color/AppPrimary, ma questo non funziona.

Come posso ottenere questo risultato?

Modifica: Devo specificare che non si tratta di risorse appCompat specifiche. Solo stringhe generiche/colori/stili/nel mio modulo principale. Come posso fare riferimento a loro nello stesso progetto nel mio modulo di libreria colors.xml/strings.xml?

risposta

7

Nel modulo libreria nel xml di layout di riferimento ?attr/colorPrimary invece di @color/AppPrimary

Questo fa riferimento la tavolozza dei colori attributi dal tema del tuo app. cioè .;

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

Si può anche fare riferimento alle altre palette di colori attributi come:

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

e così via.

Please refer to this documentation

CAVEAT:
Questi esempi fanno riferimento l'attuazione AppCompat nel tema. cioè no prefisso dello spazio dei nomi android:.

- EDIT -

La risposta breve è che semplicemente non si puo 'ottenere' un colore definito dal modulo principale di riferimento per le librerie di file colors.xml.

Tuttavia è possibile sfruttare gli attributi personalizzati definiti nel tema per ottenere lo stesso effetto.

Questo funziona dichiarando uno styleable generica nel file attrs.xml Nel modulo Libreria, Qualcosa di simile a questo:

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

Nota: Il nome del styleable ha alcun rapporto con questa implementazione quindi sentitevi liberi di nome è quello che vuoi.

Poi nella definizione del tema del tuo modulo principale nel vostro 'style.xml' o file 'theme.xml' ti consigliamo di impostare questo attributo per il colore che si desidera condividere, in questo modo:

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

Una volta definito, è possibile fare riferimento all'attributo nel codice XML del modulo della libreria. per esempio.;

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

Devo specificare che non si tratta di risorse appercettuali. Dì solo un colore generale definito nel modulo dell'app principale chiamato "dark_blue". Come ottenere quel colore dark_blue nella mia libreria colors.xml? – AnnonAshera

+0

Ho aggiornato la risposta per una suite migliore per il tuo caso d'uso. – r0adkll

+0

Grazie r0adkl Ho cambiato la struttura del progetto. Invece ho definito una libreria di base comune che tutti i moduli (librerie e app di base) possono fare riferimento con colori di applicazione/stringhe comuni ecc. – AnnonAshera

0

Ecco come è possibile ottenere gli attributi di colore mentre si è in un modulo di libreria a livello di programmazione.

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

Es.

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

Nota: Questo processo attributo di recupero di base si applica a tipi più attributi.

Problemi correlati