2015-07-07 13 views
7

To jest trochę interesujące, nie jestem pewien, jak dokładnie skonfigurować go w studiu Android. Mam kilka modułów, które mają kilka komponentów wielokrotnego użytku, których używam w różnych aplikacjach, jednak byłoby miło wprowadzić pewne motywy do komponentów wielokrotnego użytku za pomocą smaków. Zamiast tworzyć nowy smak dla każdego komponentu dla każdej aplikacji, którą piszę, myślałem o 1 module tematycznym, który miałby smak na aplikację, którą piszę, która ma schematy kolorów ... itd. Tutaj jest trochę jak chcę go skonfigurować:Moduł tematyczny Android o smakach

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

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

Teraz wolałbym gdyby wielokrotnego libs może po prostu zależy od tematu bez konieczności wiedzieć, jaki smak budować, a główny app proj w to uzależnienie od tematu może odwoływać się do smaku tej aplikacji (używając tej odpowiedzi: https://stackoverflow.com/a/24316133/1316346). Powodem tego jest to, że każdy moduł wielokrotnego użytku nie może mieć jednej aplikacji w zależnościach build.gradle lub złamie inne aplikacje odwołujące się do nich. Nużące jest również tworzenie smaku każdego modułu wielokrotnego użytku dla każdej aplikacji, którą piszę. Czy istnieje sposób na osiągnięcie czegoś takiego? Oto, co starałem:

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

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

Problem z tym jest tak szybko, jak Lib1 próbuje uzyskać dostęp do czegokolwiek w temacie, pojawia się błąd. W rzeczywistości nawet nie buduje tematu, będzie próbował zbudować Lib1 przed Theme, nawet jeśli Lib1 ma zależność (coś dziwnego w smaku). Jeśli zmienię LIB1 do:

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

Będzie pracować dla APP1, ale musiałbym albo stale go zmienić przed budowania każdą aplikację, czy wiele smaków dla każdego lib chciałbym uniknąć. Ktoś kiedykolwiek osiągnął coś takiego?

tl; dr Can odniesienie moduł smak innego modułu w oparciu o smaku zbudowany przez aplikację odsyłania tego samego modułu

+0

Dlaczego nie używasz rzeczywistych motywów w swoich aplikacjach? Jakie wartości musisz przekazać do swoich modułów? Jeśli użyjesz atrybutów motywu, takich jak '? ColorPrimary' w swoich modułach, możesz użyć zwykłego Theming bez smaków, możesz również utworzyć niestandardowe wartości, które będą uwzględnione w twoim temacie. –

Odpowiedz

0

Nie zrobiłem tego sam, ale w oparciu o moje rozumienie configuration injection, można nie zawierają wszystkie smaki w projekcie Lib1 (z odpowiednimi odpowiednimi zależnościami projektów Theme), a następnie zawierają smak konfiguracji w zależności od Lib1 w App1 i App2?

Np

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

To była moja dotychczasowa praca, ale wymaga ode mnie oddzielnego smak każdej biblioteki dla każdej tworzonej przeze mnie aplikacji, której staram się unikać. –

+0

Możesz też oddzielić swoje motywy od bibliotek, nie? Wydaje się, że jeśli tematy są integralne z bibliotekami, to będziesz mieć "smaki" tych bibliotek dla każdego tematu z natury. Jeśli tematyka wynosi 1-1 przy każdej aplikacji, to także będziesz mieć wiele smaków w bibliotekach. –

+0

Motywy są po prostu ogólnymi rzeczami, takimi jak "podstawowy kolor" i "styl przycisku", zawsze będą istnieć w projekcie motywu. Miałem nadzieję na rozwiązanie, w którym biblioteki po prostu przyciągają te wartości, nie wiedząc, który smak projektu tematycznego rzeczywiście jest zbudowany, po prostu wie, że wszystkie klucze będą istnieć. –

0

Spójrz na Oczywisty łączących: http://developer.android.com/tools/building/manifest-merge.html

Dla mające ten sam smak każdej biblioteki dla każdej aplikacji można zrobić, oznaczają w XML złoży intent:

Zamiar może być użyty z startActivity do uruchomienia Activity, broadcastIntent, aby wysłać go zainteresowanym BroadcastReceiver składników i startService(Intent) lub bindService(Intent, ServiceConnection, int) do komunikowania się z usługą w tle.

W ten sposób można uruchomić wiele aplikacji z tą samą, rozwiązując problem konieczności zmiany zależności dla każdej aplikacji.Z założenia chcesz, aby aplikacje uruchamiały się samemu z tym samym kodem.

Tak, moduł odwołujący się do smaku innego modułu opartego na aromacie może być zbudowany przez aplikację odwołującą się do tego samego modułu.

+0

Nie bardzo rozumiem, co mówisz, czy możesz podać przykład, w jaki sposób mogę to osiągnąć, biorąc pod uwagę moje przykłady z pytania? –

+0

Zasadniczo, zamiast tworzyć smak dla każdej biblioteki, użyj 'intent', aby zdefiniować początek każdej aplikacji. Spójrz na to: http://www.raywenderlich.com/103044/android-intents-tutorial LUB http://programmerguru.com/android-tutorial/android-intent-example/ – Eddev

Powiązane problemy