首先貼出demo的github地址:GitHub - TenzLiu/TenzModuleDemo: android組件化demojavascript
做者:TenzLiu
原文連接:https://www.jianshu.com/p/416ca689ebc2java
前段時間看到最近一直很火的Android組件化而後就本身擼了一個demo,期間遇到了很多問題以及坑,在此記錄一下,具體能夠看項目源碼。android
組件化無非就是將咱們App項目下的幾個模塊在com.android.application與com.android.library之間切換。以下圖:分爲modulelib(類庫模塊,一些基本工具類),modulemain(入口模塊),moduleone(模塊1),moduletwo(模塊2),而App只是擔當一個空殼工程。git
注意覺得mudulelib只是做爲一個根據庫,因此不須要改,而後就是isModule從何而來,就是在整個項目的gradle.propertiesgithub
首先modulelib是負責引用一些第三方類庫以及一些基本代碼的負責和一些工具類面試
App:api
就是說當設置isModule=true的話各個模塊處理modulelib均可以獨立運行測試,也就是能夠交給多人分開開發,最後只須要設置false就能夠合併app
各個模塊的module:工具
在這裏須要注意,modulelib的引用類庫咱們使用的是api,而不是implementation,由於implementation只能在本module有效,可是你去到如App那裏就無效了;有一些類庫引用是隻有的好比butterknife:組件化
implementation'com.jakewharton:butterknife:8.8.1'
annotationProcessor'com.jakewharton:butterknife-compiler:8.8.1'
implementation咱們須要在modulelib裏面,可是annotationProcessor卻須要在各個module裏面都要寫上。
這裏注意咱們的App下面的minifest是沒有activity的
而在modulemain的minifest下面有一個聲明做爲launcher的activity
這個程序已啓動就會運行modulemain下面的MainActivity了。
如上面所說,在modulelib引用api'com.alibaba:arouter-api:1.3.1',而後在各個module下面annotationProcessor'com.alibaba:arouter-compiler:1.1.4'
而後在各個模塊的build.gradle下的defaultConfig下添加
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName :project.getName() ] } }
這個官方文檔有說明的。
而後就是使用了,在module須要跳轉的activity或是須要獲取的fragment設置
接下來就是跳轉了,
至於fragment也是同樣,
以及fragment的獲取
可使用if,else代替
相信不少人都會用到butterknife註解,可是在module使用bb utterknife也會有坑,
如上面所說,在modulelib引用api'com.jakewharton:butterknife:8.5.1',而後在各個module下面annotationProcessor'com.jakewharton:butterknife-compiler:8.5.1'
在butterknife官方文檔也有說明,若是是在module裏面使用的話還要在各個module添加
applyplugin:'com.jakewharton.butterknife'
固然modulelib不須要,可是當你使用butterknife最新版8.8.1的時候就會由於這個報錯,我也是在這裏搞了好久馬波的,原來是butterknife最新版不兼容的問題吧應該,只須要調低版本就行了,我這裏是用了8.5.1
module使用butterknife還有一個R資源的問題,就是你butterknife註解使用的資源不能用R,而是要用butterknife提供的R2來尋找資源
資源文件:
再來看看內容對比
剩下就擼碼吧。
完~
做者:TenzLiu
原文連接:https://www.jianshu.com/p/416ca689ebc2
在這裏得到的不單單是技術!