2015-07-07 18 views
7

Vì vậy, đây là một chút thú vị, tôi không chắc chắn làm thế nào chính xác để thiết lập nó trong studio android. Tôi có một số mô-đun có một số thành phần có thể sử dụng lại mà tôi sử dụng trong các ứng dụng khác nhau, tuy nhiên sẽ tốt hơn nếu bạn chèn các chủ đề nhất định vào các thành phần có thể sử dụng lại bằng cách sử dụng các hương vị. Thay vì tạo ra một hương vị mới cho mọi thành phần cho mọi ứng dụng tôi viết, tôi đã nghĩ đến việc có 1 mô-đun Theme, có thể có một hương vị cho mỗi ứng dụng tôi viết, có các lược đồ màu ... v.v. Đây là loại làm thế nào tôi muốn nó thiết lập:Mô-đun chủ đề Android với hương vị

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

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

Bây giờ tôi muốn nếu libs tái sử dụng chỉ có thể phụ thuộc vào chủ đề mà không cần phải biết được hương vị để xây dựng, và các proj ứng dụng chính trong đó là sự phụ thuộc vào chủ đề có thể tham khảo hương vị cho ứng dụng đó (sử dụng câu trả lời này https://stackoverflow.com/a/24316133/1316346). Lý do cho điều này là mỗi mô-đun tái sử dụng không thể có một ứng dụng duy nhất trong phụ thuộc build.gradle của nó hoặc nó sẽ phá vỡ các ứng dụng khác tham chiếu đến chúng. Nó cũng tẻ nhạt để phải làm cho một hương vị của mỗi mô-đun tái sử dụng cho mỗi ứng dụng tôi viết. Có cách nào để đạt được một cái gì đó như thế này? Đây là những gì tôi đã cố gắng:

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

Vấn đề ở đây là ngay sau khi Lib1 cố gắng truy cập bất kỳ thứ gì trong chủ đề, nó sẽ là một lỗi. Trong thực tế nó thậm chí không xây dựng chủ đề đầu tiên, nó sẽ cố gắng để xây dựng Lib1 trước khi Theme mặc dù Lib1 có một phụ thuộc (một cái gì đó kỳ lạ với hương vị). Nếu tôi thay đổi Lib1 thành:

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

Nó sẽ hoạt động cho ứng dụng1, nhưng tôi phải liên tục thay đổi nó trước khi tạo mỗi ứng dụng hoặc thực hiện nhiều hương vị cho mỗi lib mà tôi muốn tránh. Có ai từng đạt được thứ gì như thế này không?

tl; dr Can một tài liệu tham khảo mô-đun một hương vị của mô-đun khác dựa trên các hương vị được xây dựng bởi các ứng dụng tham khảo các mô-đun cùng

+0

Tại sao bạn không sử dụng các chủ đề thực tế trong ứng dụng của mình? Bạn cần loại giá trị nào để chuyển vào các mô-đun của mình? Nếu bạn sử dụng các thuộc tính chủ đề như '? ColorPrimary' trong mô-đun của mình, bạn có thể sử dụng chủ đề thuần túy mà không có hương vị, bạn cũng có thể tạo các giá trị tùy chỉnh để bao gồm trong chủ đề của mình –

Trả lời

0

tôi đã không làm điều này bản thân mình, nhưng dựa trên sự hiểu biết của tôi về configuration injection, có thể bạn không bao gồm tất cả các hương vị trong dự án Lib1 (với các phụ thuộc chính xác của dự án Theme tương ứng) và sau đó bao gồm hương vị cấu hình trong Lib1 Dependency của bạn trong App1 và App2?

Ví dụ,

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

. hương vị của mỗi thư viện cho mọi ứng dụng tôi tạo ra, mà tôi đang cố gắng tránh. –

+0

Hoặc bạn có thể bỏ cặp của bạn từ các thư viện, phải không? Có vẻ như nếu các chủ đề là không thể thiếu đối với các thư viện, thì bạn sẽ có 'hương vị' của các thư viện đó cho mỗi chủ đề vốn có. Nếu các chủ đề là 1-1 với mỗi ứng dụng bạn thực hiện, sau đó tương tự như vậy bạn sẽ có nhiều hương vị trong các thư viện. –

+0

Các chủ đề chỉ là những thứ chung chung như 'màu chính' và 'kiểu nút', chúng sẽ luôn tồn tại trong dự án chủ đề. Tôi đã hy vọng cho một giải pháp mà các thư viện chỉ cần kéo vào những giá trị mà không biết được hương vị của dự án chủ đề thực sự được xây dựng, nó chỉ biết tất cả những chìa khóa đó sẽ tồn tại. –

0

Hãy xem Ghép Manifest: http://developer.android.com/tools/building/manifest-merge.html

Đối với việc có cùng một đặc trưng của tất cả các thư viện cho mỗi ứng dụng bạn thực hiện, biểu thị trong XML file một intent:

Mục đích có thể được sử dụng với startActivity để khởi động một Activity, broadcastIntent để gửi cho bất kỳ ai quan tâm BroadcastReceiver thành phần và startService(Intent) hoặc bindService(Intent, ServiceConnection, int) để giao tiếp với Dịch vụ nền.

Bằng cách đó, bạn có thể khởi động nhiều ứng dụng với cùng một ứng dụng, giải quyết vấn đề phải thay đổi phụ thuộc cho mọi ứng dụng.Với mục đích, bạn sẽ chỉ có các ứng dụng bắt đầu bằng chính mã đó.

Có, tham chiếu mô-đun một hương vị của mô-đun khác dựa trên hương vị có thể được xây dựng bởi ứng dụng tham chiếu cùng một mô-đun.

+0

Tôi không hoàn toàn hiểu những gì bạn đang nói, bạn có thể đưa ra một ví dụ làm thế nào tôi có thể thực hiện được cho ví dụ của tôi từ câu hỏi? –

+0

Về cơ bản, thay vì tạo một hương vị cho mỗi thư viện, hãy sử dụng 'intent' để xác định sự khởi đầu của mỗi ứng dụng. Hãy xem xét điều này: http://www.raywenderlich.com/103044/android-intents-tutorial HOẶC http://programmerguru.com/android-tutorial/android-intent-example/ – Eddev

Các vấn đề liên quan