2015-07-07 13 views
7

Das ist also ein bisschen interessant, ich bin mir nicht sicher, wie genau es in Android Studio einrichten. Ich habe mehrere Module, die einige wiederverwendbare Komponenten haben, die ich in verschiedenen Apps verwende, aber es wäre nett, bestimmte Themen in die wiederverwendbaren Komponenten mit Aromen zu injizieren. Anstatt für jede Komponente, die ich schreibe, einen neuen Geschmack für jede Komponente zu kreieren, dachte ich daran, ein Thema-Modul zu haben, das eine Geschmacksrichtung pro App hat, die ich schreibe, die Farbschemata hat ... usw. Hier ist eine Art, wie ich will sie aufrichtenAndroid Thema Modul mit Aromen

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

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

Jetzt würde ich es vorziehen, wenn die wieder verwendbaren Libs einfach auf Thema verlassen können, ohne wissen zu müssen, welcher Geschmack zu bauen, und der Haupt-App proj in seiner Abhängigkeit von Thema könnte den Geschmack für diese App verweisen (mit dieser Antwort https://stackoverflow.com/a/24316133/1316346). Der Grund dafür ist, dass jedes wiederverwendbare Modul keine einzelne Anwendung in seinen build.gradle-Abhängigkeiten haben kann oder andere Apps, die auf sie verweisen, durchbrechen würde. Es ist auch mühsam, jedes wiederverwendbare Modul für jede App, die ich schreibe, zu gestalten. Gibt es eine Möglichkeit, so etwas zu erreichen? Hier ist, was ich versucht:

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') 
} 

Das Problem dabei ist, Sobald Lib1 versucht, auf irgendetwas im Theme zuzugreifen, wird ein Fehler angezeigt. Tatsächlich erstellt es nicht einmal das erste Thema, es wird versuchen, Lib1 vor Theme zu erstellen, obwohl Lib1 eine Abhängigkeit hat (etwas komisches mit den Aromen). Wenn ich Lib1 zu ändern:

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

wird es für app1 arbeiten, aber ich würde haben, entweder es ständig ändern, bevor Sie jede App zu bauen, oder tun viele Aromen für jeden lib würde ich gerne vermeiden. Hat jemand jemals so etwas erreicht?

tl; dr kann ein Modul Referenz ein Aroma eines anderen Moduls auf der Grundlage der von der App gebaut Geschmack Referenzierung das gleiche Modul

+0

Warum verwenden Sie keine tatsächlichen Themen in Ihren Apps? Welche Art von Werten müssen Sie in Ihre Module einbringen? Wenn Sie Themenattribute wie '? ColorPrimary' in Ihren Modulen verwenden, können Sie einfache Schemas ohne Aromastoffe verwenden. Sie können auch benutzerdefinierte Werte für Ihr Thema erstellen. –

Antwort

0

ich das nicht selbst getan haben, sondern basiert auf meinem Verständnis von configuration injection, konnte man nicht alle Flavors in das Lib1-Projekt aufnehmen (mit den entsprechenden korrekten Abhängigkeiten des Theme-Projekts) und dann den Konfigurations-Flavor in deine Lib1-Abhängigkeit in App1 und App2 aufnehmen?

ZB

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

Das war bisher meine Arbeit, erfordert aber, dass ich ein separates habe Geschmack jeder Bibliothek für jede App, die ich mache, die ich versuche zu vermeiden. –

+0

Oder Sie können Ihre Theming aus den Bibliotheken entkoppeln, nicht? Es scheint, dass, wenn die Themen in die Bibliotheken integriert sind, Sie "Geschmacksrichtungen" dieser Bibliotheken für jedes Thema inhärent haben. Wenn die Themen 1-1 mit jeder App sind, die du erstellst, dann wirst du auch so viele Varianten in den Bibliotheken haben. –

+0

Die Themen sind nur allgemeine Dinge wie "Primärfarbe" und "Knopf-Stil", sie werden immer im Thema-Projekt existieren. Ich habe auf eine Lösung gehofft, bei der die Bibliotheken diese Werte einfach einholen, ohne zu wissen, welche Variante des Theme-Projekts tatsächlich erstellt wurde, es weiß nur, dass alle diese Schlüssel existieren werden. –

0

Werfen Sie einen Blick auf Manifest Merging: http://developer.android.com/tools/building/manifest-merge.html

Für für jede App den gleichen Geschmack von jeder Bibliothek, die Sie machen, bezeichnen in den XML-Dateien ein intent:

Intent kann mit startActivity verwendet werden, um eine Activity, broadcastIntent starten, um es an alle interessiertenzu sendenKomponenten und startService(Intent) oder bindService(Intent, ServiceConnection, int) mit einem Hintergrunddienst zu kommunizieren.

Auf diese Weise können Sie mehrere Apps mit derselben starten, wodurch das Problem, die Abhängigkeiten für jede App zu ändern, gelöst werden muss.Mit Absicht würden Sie Apps nur mit demselben Code starten.

Ja, eine Modulreferenz ein Flavour eines anderen Moduls basierend auf dem Flavor kann von der App erstellt werden, die auf dasselbe Modul verweist.

+0

Ich verstehe nicht ganz, was Sie sagen, können Sie ein Beispiel geben, wie ich das erreichen könnte, wenn ich meine Beispiele aus der Frage anführe? –

+0

Im Grunde, anstatt eine Geschmacksrichtung für jede Bibliothek zu erstellen, verwenden Sie eine "Absicht", um einen Start jeder App zu definieren. Werfen Sie einen Blick darauf: http://www.raywenderlich.com/103044/android-intent-tutorial ODER http://programmerguru.com/android-tutorial/android-intent-example/ – Eddev

Verwandte Themen