1.前言
有時滞伟,我們會使用一些重復的模板代碼,通常都是使用CV大法來完成炕贵。但是梆奈,這樣的搬磚效率并不高,因此称开,我們需要使用高級搬磚技能--自定義代碼模板鉴裹。
我們使用Android Studio創(chuàng)建新工程時,可以選擇不同的模板钥弯,然后Android Studio就會自動生成相應的代碼模板了径荔。如下圖:
這實際上是Android Studio內置的一些默認模板。我們先來研究一下內置的代碼模板脆霎,然后再實現(xiàn)自定義代碼模板总处。
2.初識代碼模板
Android代碼模板都位于Android Studio安裝路徑\plugins\android\lib\templates
目錄下
- activities目錄下都是一些Activity的模板。
- gradle-projects目錄下則是一些創(chuàng)建Project和Module的模板睛蛛。
- other目錄下是其他類的模板鹦马。包括Fragment,BroadcastReceiver等等忆肾。
2.1 模板結構
我們來看下EmptyActivity這個模板荸频,
路徑為:Android Studio安裝路徑\plugins\android\lib\templates\activities\EmptyActivity
。如下:
- root文件夾:模板代碼和資源存放在此目錄下客冈。
- globals.xml.ftl : 存放一些全局變量旭从。
- template.xml : 模板的配置文件,包括面板顯示內容场仲,全局變量文件和指定執(zhí)行文件等等和悦。
- recipe.xml.ftl : 定義復制文件的規(guī)則,添加新的依賴等等渠缕。
- template_blank_activity.png:模板預覽圖鸽素。在選擇界面展示使用。
2.2 ftl文件
上面的一些文件是以ftl后綴結尾的亦鳞。那么ftl是什么呢馍忽?ftl全名FreeMarker Template Language,即FreeMarker模板語言燕差。FreeMarker則是一款模板引擎遭笋,這里就不細說了。有興趣的自行查找資料吧谁不。
${}
坐梯、<#if></#if>
和<#include>
等等都是FreeMarker的語法,后面會使用到刹帕。
3. 模板文件詳解
下面來詳細介紹涉及到文件里面包含的內容吵血。
3.1 globals.xml.ftl
globals.xml.ftl是用來存放一些全局變量。
先來看下EmptyActivity模板里的globals.xml.ftl的內容:
<globals>
<global id="requireTheme" type="boolean" value="true" />
<#include "../common/common_globals.xml.ftl" />
<global id="simpleLayoutName" value="${contentLayoutName}" />
<global id="appBarLayoutName" value="${layoutName}" />
<global id="fragmentClass" value="${activityClass}Fragment" />
</globals>
id
:存放變量名偷溺。我們可以在其他ftl文件中通過${ 變量 }來訪問定義在這里的變量的值蹋辅,如:${requireTheme}
。type
:變量的類型挫掏。有string侦另,boolean,integer等類型尉共。默認是string類型褒傅,可以省略不寫。value
:變量值袄友。
另外殿托,可以通過<#include "../common/common_globals.xml.ftl" />
來導入其他文件中定義好的變量。
除了以上這些剧蚣,還可以使用<#if 條件><#else>
支竹,如下:
<#if !appCompat>
<global id="superClass" type="string" value="Activity"/>
<#elseif appCompatActivity>
...
<#else>
...
</#if>
根據條件可以定義不同的變量值。
3.2 template.xml
template.xml就是模板的配置文件鸠按,用來配置面板顯示的內容礼搁,指定全局變量文件和指定執(zhí)行文件等等。
<template
format="5"
revision="5"
name="Empty Activity"
minApi="9"
minBuildApi="14"
description="Creates a new empty activity">
<category value="Activity" />
<formfactor value="Mobile" />
<parameter
id="activityClass"
name="Activity Name"
type="string"
constraints="class|unique|nonempty"
suggest="${layoutToActivity(layoutName)}"
default="MainActivity"
help="The name of the activity class to create" />
<!-- 省略部分內容 -->
<!-- 128x128 thumbnails relative to template.xml -->
<thumbs>
<!-- default thumbnail is required -->
<thumb>template_blank_activity.png</thumb>
</thumbs>
<globals file="globals.xml.ftl" />
<execute file="recipe.xml.ftl" />
</template>
template屬性解釋:
format
:固定值revision
:版本號name
:模板名minApi
:對應minSdkVersionminBuildApi
:最小編譯APIdescription
:模板描述
再來看看其子節(jié)點目尖,主要有以下幾種: category
馒吴、formfactor
、parameter
瑟曲、thumbs
募书、globals
、 execute
测蹲。下面分別來看下:
3.2.1 category
<category value="Activity" />
category可以設置成Activity
莹捡、Folder
、Fragment
等等值扣甲。設置完之后可以在相應的目錄下看到這個模板篮赢,如下圖所示:
3.2.2 formfactor
<formfactor value="Mobile" />
formfactor可以設置以下值:Mobile
、Wear
琉挖、TV
启泣、Car
、Things
示辈,分別對應如下圖寥茫。也可以不設置該節(jié)點。
如果我們想在新建工程時可以看到我們自己定義的模板矾麻,可以設置該節(jié)點纱耻。否則可以不設置芭梯。
ps:在我的Android studio上,設置成
TV
或其他值的話可以看到有模板弄喘,但是設置成Mobile
的卻看不到玖喘,有知道原因的嗎?可以回復一下~
3.2.3 parameter
<parameter
id="activityClass"
name="Activity Name"
type="string"
constraints="class|unique|nonempty"
suggest="${layoutToActivity(layoutName)}"
default="MainActivity"
help="The name of the activity class to create" />
parameter節(jié)點主要就是用來顯示可修改的變量蘑志,如下圖所示:
再來看看各個參數的意思:
id
:變量名name
:展示出來的名字type
:變量類型累奈,有string、boolean急但、enum等等值constraints
:約束類型澎媒,有class、unique波桩、nonempty戒努、apilevel、package突委、activity柏卤、layout、drawable匀油、string缘缚、id、exists等等值敌蚜,可以組合在一起使用suggest
:提示值桥滨,未修改變量時根據其他變量生成default
:默認值help
:幫助提示visibility
:是否可見
上面這些參數是比較常用的一些,另外還有一些比較少用的弛车,可以參考內置模板去使用齐媒。
3.2.4 thumbs
<!-- 128x128 thumbnails relative to template.xml -->
<thumbs>
<!-- default thumbnail is required -->
<thumb>template_blank_activity.png</thumb>
</thumbs>
顯示一個縮略圖。
3.2.5 globals
<globals file="globals.xml.ftl" />
指定全局變量的文件纷跛,一般不用改此值喻括。
3.2.6 execute
<execute file="recipe.xml.ftl" />
指定執(zhí)行操作的文件,一般不用改此值贫奠。
3.3 recipe.xml.ftl
recipe.xml.ftl主要是用來定義復制文件的規(guī)則唬血,添加新的依賴等等。
<#import "root://activities/common/kotlin_macros.ftl" as kt>
<recipe>
<#include "../common/recipe_manifest.xml.ftl" />
<@kt.addAllKotlinDependencies />
<#if generateLayout>
<#include "../common/recipe_simple.xml.ftl" />
<open file="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
</#if>
<instantiate from="root/src/app_package/SimpleActivity.${ktOrJavaExt}.ftl"
to="${escapeXmlAttribute(srcOut)}/${activityClass}.${ktOrJavaExt}" />
<open file="${escapeXmlAttribute(srcOut)}/${activityClass}.${ktOrJavaExt}" />
</recipe>
先來看下一些會用到的操作:
copy
:復制文件唤崭。將from指定的文件或文件夾復制到to中的位置拷恨。如果是.ftl后綴的話,復制后會去掉.ftl后綴谢肾。merge
:合并文件腕侄。一般用于對AndroidManifest.xml等文件進行合并操作。instantiate
:實例化文件。完成模板中的命令冕杠,生成符合要求的文件微姊。比如:我們在新建Activity時輸入了Activity的類名,那么就可以通過instantiate
來生成一個指定類名的Activity類了拌汇。open
:打開文件柒桑。完成操作后在Android Studio的標簽欄打開指定文件弊决。dependency
:添加依賴噪舀。一般配合hasDependency
函數來使用。
除了上面這些操作以外飘诗,還可以通過 #import
導入其他的文件与倡,或者配合使用#if
等等。
recipe.xml.ftl中一些常用的路徑:
${escapeXmlAttribute(resOut)}
:當前Module的res 文件夾${escapeXmlAttribute(topOut)}
:整個工程的根目錄${escapeXmlAttribute(projectOut)}
:當前Module 的根目錄${escapeXmlAttribute(manifestOut)}
:AndroidManifest.xml所在的文件夾${escapeXmlAttribute(testOut)}
:測試文件的文件夾${escapeXmlAttribute(srcOut)}
:包名下的路徑
4. 實戰(zhàn)演練
目前沒想到比較合適的例子昆稿,先略過了~~
反正Android Studio已經內置了一大堆模板了纺座,有啥問題翻翻已有模板基本都可以解決了。
熟悉了模板之后溉潭,我們也可以對系統(tǒng)內置的模板進行修改净响,這篇是一些常用的修改,有興趣的可以看看:提升開發(fā)效率之修改Android Studio默認的project和module模板