Android元件化開發實踐(七):開發常見問題及解決方案
我們在單一工程裡開發時程式碼執行良好,但是在進行元件化開發時,經常會出現一些莫名其妙的問題。
1. ButterKnife無法使用
元件化之後,在library中使用ButterKnife,會發現引用R.id的地方都會飄紅報錯:

檢視錯誤原因都是: Attribute value must be constant 。這是因為在library中生成的R檔案,這些屬性值都不是常量,而@BindView註解這裡是需要傳入常量值的,我們找到 ofollow,noindex">R.id 類看看:

從圖中可以看到,這些id都是 public static int 型別的,所以這些地方都會報錯,ButterKnife提供了外掛來解決這個問題。
- 在專案的build.gradle裡增加配置:
dependencies { classpath 'com.android.tools.build:gradle:3.0.1' classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0' }
注意gradle使用的版本號為3.0以上,butterknife-gradle-plugin的版本號為8.4.0,特別注意不要使用最新的版本,8.4.0剛剛好,否則總是編譯報錯。
- 在module的build.gradle裡宣告外掛:
apply plugin: 'com.jakewharton.butterknife'
- 在module的build.gradle裡增加依賴:
compile 'com.jakewharton:butterknife:8.4.0' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
- 使用R2而不是R

型別常量值了,這些都是是外掛為我們生成。

- click事件

同樣,click事件裡也必須採用R2.id來替換R.id,但是onClick()方法裡不能使用switch case語句,必須使用if else來代替,在方法體內部是不能使用R2.id的,R2類只限於在外部註解中使用。
2. 元件生命週期自動註冊載入
在元件生命週期管理這篇文章中,我介紹了元件都有一個自己的類似Application類,但是會引入一個問題:在殼工程整合各種業務元件時,會存在硬編碼的問題,耦合嚴重,違背了元件化的初衷。為了解決該問題,我們可以採用APT技術,以及通過自定義gradle外掛,在打包編譯期間通過動態插入位元組碼的方式,實現元件生命週期類的自動註冊載入。具體實現方式可參考: Android元件化開發實踐(八):元件生命週期如何實現自動註冊管理 。
3. 不同元件間資料如何互動
TODO...
持續更新中...