提升開發(fā)效率之自定義Android Studio代碼模板

1.前言

有時滞伟,我們會使用一些重復的模板代碼,通常都是使用CV大法來完成炕贵。但是梆奈,這樣的搬磚效率并不高,因此称开,我們需要使用高級搬磚技能--自定義代碼模板鉴裹。

我們使用Android Studio創(chuàng)建新工程時,可以選擇不同的模板钥弯,然后Android Studio就會自動生成相應的代碼模板了径荔。如下圖:


Android Studio內置代碼模板.png

這實際上是Android Studio內置的一些默認模板。我們先來研究一下內置的代碼模板脆霎,然后再實現(xiàn)自定義代碼模板总处。

2.初識代碼模板

Android代碼模板都位于Android Studio安裝路徑\plugins\android\lib\templates目錄下

templates目錄.png

  • activities目錄下都是一些Activity的模板。
  • gradle-projects目錄下則是一些創(chuàng)建Project和Module的模板睛蛛。
  • other目錄下是其他類的模板鹦马。包括Fragment,BroadcastReceiver等等忆肾。

2.1 模板結構

我們來看下EmptyActivity這個模板荸频,
路徑為:Android Studio安裝路徑\plugins\android\lib\templates\activities\EmptyActivity。如下:

EmptyActivity模板.png

  • 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:對應minSdkVersion
  • minBuildApi:最小編譯API
  • description:模板描述

再來看看其子節(jié)點目尖,主要有以下幾種: category馒吴、formfactorparameter瑟曲、thumbs募书、globalsexecute测蹲。下面分別來看下:

3.2.1 category

 <category value="Activity" />

category可以設置成Activity莹捡、FolderFragment等等值扣甲。設置完之后可以在相應的目錄下看到這個模板篮赢,如下圖所示:

4.category.png

3.2.2 formfactor

<formfactor value="Mobile" />

formfactor可以設置以下值:MobileWear琉挖、TV启泣、CarThings示辈,分別對應如下圖寥茫。也可以不設置該節(jié)點。

5.formfactor.png

如果我們想在新建工程時可以看到我們自己定義的模板矾麻,可以設置該節(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é)點主要就是用來顯示可修改的變量蘑志,如下圖所示:


6.parameter.png

再來看看各個參數的意思:

  • 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模板

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末喳瓣,一起剝皮案震驚了整個濱河市馋贤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌畏陕,老刑警劉巖配乓,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異惠毁,居然都是意外死亡犹芹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門鞠绰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腰埂,“玉大人,你說我怎么就攤上這事蜈膨∮炝” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵丈挟,是天一觀的道長刁卜。 經常有香客問我,道長曙咽,這世上最難降的妖魔是什么蛔趴? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮例朱,結果婚禮上孝情,老公的妹妹穿的比我還像新娘鱼蝉。我一直安慰自己,他們只是感情好箫荡,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布魁亦。 她就那樣靜靜地躺著,像睡著了一般羔挡。 火紅的嫁衣襯著肌膚如雪洁奈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天绞灼,我揣著相機與錄音利术,去河邊找鬼。 笑死低矮,一個胖子當著我的面吹牛印叁,可吹牛的內容都是我干的。 我是一名探鬼主播军掂,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼轮蜕,長吁一口氣:“原來是場噩夢啊……” “哼蝗锥!你這毒婦竟也來了跃洛?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤玛追,失蹤者是張志新(化名)和其女友劉穎税课,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體痊剖,經...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡韩玩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了陆馁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片找颓。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖叮贩,靈堂內的尸體忽然破棺而出击狮,到底是詐尸還是另有隱情,我是刑警寧澤益老,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布彪蓬,位于F島的核電站,受9級特大地震影響捺萌,放射性物質發(fā)生泄漏档冬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酷誓。 院中可真熱鬧披坏,春花似錦、人聲如沸盐数。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玫氢。三九已至帚屉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間琐旁,已是汗流浹背涮阔。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工猜绣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留灰殴,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓掰邢,卻偏偏與公主長得像牺陶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辣之,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345