背景
我們知道,在Android開發中,官方提供了很多模闆,可以直接建立成套的代碼,很是友善開發
這種代碼模闆其實不是什麼新鮮的技術,Google其實就是把Freemarker模闆引擎整合到了Android Studio中。
下面我們研究一下Android Studio的模闆,并自定義兩個代碼模闆。
模闆檔案淺析
我們打開Android Studio的模闆檔案,分析一下這種檔案的構成,檔案位址為..\Android Studio\plugins\android\lib\templates\,我們在AS中使用的模闆都在這裡出現。
我們以..\Android Studio\plugins\android\lib\templates\activities\LoginActivity為例,分析一下模闆檔案是怎麼運作的
檔案夾中的檔案及各檔案的作用如下:
在上圖中,出現了三種檔案,ftl、xml和png
ftl是freemarker檔案,跟模闆檔案操作相關的操作都在ftl檔案中定義
xml有兩個,根目錄下的template.xml定義了我們在使用模闆時顯示的界面;另一個res檔案夾下的xml檔案沒有邏輯功能,将直接被複制到我們的工程中
png隻有根目錄下的那個檔案,其實就顯示在我們使用模闆時顯示的界面裡,作為該模闆的logo使用
我們再看看根目錄下的三個檔案的檔案内容
·template.xml
template.xml定義了使用模闆時的界面,我們先看LoginActivity的模闆界面
我們看看template.xml如何定義這個界面
定義模闆類别
定義輸入項
容易看到,每個輸入框的預設值、提示、類型等都是在xml中定義的。
需要注意的是,我們更改Activity Name時,Layout Name也會随之更改,這是通過“suggest="${activityToLayout(activityClass)}"”實作的,其中${activityToLayout()是個函數,用于把Activity的類名XXXActivity轉換成Layout名activity_XXX;而這個函數的入參“activityClass”就是“Activity Name”這個輸入框對應的id“activityClass”。
最後是定義logo和包名
template的作用不止是定義模闆的界面,事實上,通過在template裡定義的id,其他ftl檔案就可以擷取我們在界面上輸入的類名和檔案名等,為自動生成檔案和代碼提供輸入參數。
例如,在LoginActivity.java.ftl中,生成XXXActivity.java檔案時,檔案的名字,類的名字,都會根據template檔案中activityClass的值進行指派
·globals.xml.ftl
定義一些全局變量
如上圖所示,在globals裡定義了一個與API版本有關的boolean值,這個值将在生成LoginActivity的代碼時,用來判斷是否要添加部分代碼
·recipe.xml.ftl
recipe.xml.ftl用來定義如何生成代碼和檔案
·其他模闆代碼檔案
除了根目錄下的globals.xml.ftl、recipe.xml.ftl、template.xml三個檔案,其他模闆都可以根據需要自由配置。
制作自定義MVPActivity模闆
模闆檔案結構如下
核心就在于代碼檔案夾裡的三個檔案,分别是MVP的接口、Presenter和Activity,檔案内容分别如下:
Contract的模闆檔案:
Presenter的模闆檔案:
Activity的模闆檔案:
在recipe.xml.ftl檔案中把這幾個檔案初始化并複制到工程中
最後,把整個檔案夾複制到..\Android Studio\plugins\android\lib\templates\activities\下,
重新開機Android Studio
,就可以應用了
在Activity類别的模闆中,多了一個Empty MVP Activity
打開後,界面如下
我們注意到,最前面有個Biz Name的輸入參數,這個參數的作用不是生成檔案,而是為後面的檔案統一命名,因為Activity Name隻能影響到Layout Name,我希望能一起設定接口和Presenter的名字,但是Freemarker沒有和${activityToLayout()這個函數對應的生成接口和Presenter名字的函數,是以我在最前面增加了這樣一個變量,專門用于統一命名。
具體在template.xml檔案中,增加了一個id為“activityName”的變量,并為後續的變量指派,如在“activityClass”中,把suggest的值設定為"${activityName}Activity",讓它自己拼出XXXActivity的名字。
生成的檔案結構如下
生成的Activity檔案
生成的Presenter
生成的Contract
至此,我們完成了自定義代碼模闆的編寫和使用
附錄
Android進階技術大綱,以及系統進階視訊;
圖一;Android進階技術大綱
圖二;Android進階系統資料視訊
擷取方式;