2015-07-07 12 views
7

Quindi questo è un po 'interessante, non sono sicuro di come impostarlo esattamente in Android Studio. Ho diversi moduli che hanno alcuni componenti riutilizzabili che uso in varie app, tuttavia sarebbe bello iniettare determinati temi nei componenti riutilizzabili usando i sapori. Piuttosto che creare un nuovo sapore per ogni componente per ogni app che scrivo, stavo pensando di avere 1 modulo Temi, che avrebbe un sapore per app che scrivo, che ha schemi di colori ... ecc. Qui è una specie di come lo voglio istituito:Modulo tema Android con sapori

 
App1: dependencies 
reusable lib1 
reusable lib3 
reusable lib4 
theme - App1 flavor 

App2: dependencies 
reusable lib1 
reusable lib2 
reusable lib4 
theme - App2 flavor 

Ora io preferirei se le librerie riutilizzabili potrebbe semplicemente dipendere dal tema senza bisogno di sapere che sapore di costruire, e l'applicazione principale proj nella sua dipendenza dal tema potrebbe fare riferimento al sapore di quell'app (usando questa risposta https://stackoverflow.com/a/24316133/1316346). La ragione di ciò è che ogni modulo riutilizzabile non può avere una singola app nelle sue dipendenze build.gradle o potrebbe rompere altre app che fanno riferimento a esse. È anche noioso dover dare un sapore a ciascun modulo riutilizzabile per ogni app che scrivo. C'è un modo per ottenere qualcosa di simile? Ecco quello che ho provato:

App1 build.gradle:

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    compile 'com.android.support:appcompat-v7:22.1.1' 
    compile project(path: ':Theme', configuration: 'app1Release') 
    compile project(':Lib1') 
    compile project(':Lib2') 
    compile project(':Lib4') 
} 

App2 build.gradle:

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    compile 'com.android.support:appcompat-v7:22.1.1' 
    compile project(path: ':Theme', configuration: 'app2Release') 
    compile project(':Lib1') 
    compile project(':Lib3') 
    compile project(':Lib4') 
} 

Lib1 build.gradle:

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    compile 'com.android.support:appcompat-v7:22.1.1' 
    compile project(path: ':Theme') 
} 

Il problema di questo è non appena Lib1 tenta di accedere a qualsiasi cosa nel tema, si ottiene un errore. In effetti, non crea nemmeno il tema per primo, tenterà di costruire Lib1 prima del tema anche se Lib1 ha una dipendenza (qualcosa di strano con i sapori). Se cambio Lib1 a:

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    compile 'com.android.support:appcompat-v7:22.1.1' 
    compile project(path: ':Theme', configuration: 'app1Release') 
} 

Si lavorerà per app1, ma avrei dovuto sia costantemente cambiarlo prima di costruire ogni app, o fare un sacco di sapori per ogni lib vorrei evitare. Qualcuno ha mai ottenuto qualcosa del genere?

tl; dr Può un riferimento del modulo un sapore di un altro modulo in base al sapore costruito da app riferimento lo stesso modulo

+0

Perché non utilizzi temi reali nelle tue app? Che tipo di valori hai bisogno di passare nei tuoi moduli? Se utilizzi attributi di tema come '? ColorPrimary' nei tuoi moduli puoi usare il semplice Theming senza aromi, puoi anche creare valori personalizzati da includere nel tuo tema –

risposta

0

non ho fatto io stesso, ma in base alla mia comprensione di configuration injection, potrebbe non includere tutti gli aromi nel progetto Lib1 (con le corrispondenti dipendenze di progetto tema corretti) e quindi includere l'aroma di configurazione nella dipendenza da Lib1 in App1 e App2?

Ad esempio,

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    compile 'com.android.support:appcompat-v7:22.1.1' 
    compile project(path: ':Theme', configuration: 'app1Release') 
    compile project(path: ':Lib1', configuration: 'app1Release') 
    compile project(':Lib3') 
    compile project(':Lib4') 
} 
+1

Questo è stato il mio work around finora, ma mi richiede di avere un separato sapore di ogni libreria per ogni app che faccio, che sto cercando di evitare. –

+0

Oppure puoi disaccoppiare il tuo tema dalle librerie, no? Sembra che se i temi sono parte integrante delle librerie, allora si avranno 'sapori' di quelle librerie per ciascun tema intrinsecamente. Se i temi sono 1-1 con ogni app che crei, avrai anche molti sapori nelle librerie. –

+0

I temi sono solo cose generiche come 'primary-color' e 'button-style', saranno sempre presenti nel progetto del tema. Speravo in una soluzione in cui le librerie inserissero quei valori senza sapere quale sapore del progetto a tema fosse effettivamente costruito, semplicemente sa che tutte quelle chiavi esisteranno. –

0

Date un'occhiata a Merging manifesto: http://developer.android.com/tools/building/manifest-merge.html

Per avere lo stesso sapore di ogni biblioteca per ogni app che fate, denotano in XML file un intent:

Intent può essere utilizzato con startActivity per avviare un Activity, broadcastIntent per inviarlo a qualsiasi interessatoComponentie startService(Intent) o bindService(Intent, ServiceConnection, int) per comunicare con un servizio in background.

In questo modo, è possibile avviare più app con la stessa soluzione, risolvendo il problema di dover modificare le dipendenze per ogni app.Con l'intento, avresti solo le app che iniziano con lo stesso codice da solo.

Sì, un modulo di riferimento di un altro modulo basato sull'aroma può essere creato dall'app che fa riferimento allo stesso modulo.

+0

Non capisco bene cosa stai dicendo, puoi fare un esempio di come potrei realizzarlo dato i miei esempi dalla domanda? –

+0

Fondamentalmente, invece di creare un aroma per ogni libreria, utilizzare un 'intent' per definire un inizio di ogni app. Date un'occhiata a questo: http://www.raywenderlich.com/103044/android-intents-tutorial O http://programmerguru.com/android-tutorial/android-intent-example/ – Eddev