Android Template使用

Android Template使用

由于在項目中使用了Mvp+Dagger的模式進行開發(fā)涮阔,在實際使用中針對一個頁面需要建六七個頁面汛闸,而這里面很多代碼是重復(fù)性的,所以考慮要使用Template來提高工作效率


參考文章:

具體的使用方法在上面的文章中已經(jīng)有了講解,我這里就記錄一下自己的使用經(jīng)過涮拗。

AndroidStudio提供的有多種模版媒抠,位置在

{AndroidStudio安裝目錄}/plugins/android/lib/templates/

對應(yīng)到我的機器上是:

/Users/xxx/Applications/Android Studio.app/Contents/plugins/android/lib/templates/activities/

這個目錄下有As自己預(yù)設(shè)好的各種模版善玫,我們在 new-> activity->BasicActivity操作的時候使用的就是這里的預(yù)設(shè)模版工窍。

我們需要做的是把我們自己寫好的模版(Mvp Activity)放到這個目錄的/activitys目錄下,重啟AndroidStudio壁畸。就可以在new->activity->Mvp Activity中使用我們自己寫的模版了贼急。

template1.jpeg

通過對預(yù)設(shè)模版的分析,發(fā)現(xiàn)目錄結(jié)構(gòu)如下:

  • root/
  • root/res(該目錄下是放置資源文件的)
  • root/src(該目錄下是放置源代碼的)
  • globals.xml.ftl(該文件配置全局變量)
  • recipe.xml.ftl(該文件負(fù)責(zé)具體的文件merge 命名 打開文件等操作)
  • template.xml(該文件定義新建輸入項)
template2.jpeg

root/res root/src

root/res以及root/src目錄下放置我們的資源文件以及源代碼文件捏萍,對應(yīng)我們開發(fā)時項目目錄結(jié)構(gòu)下的res目錄和src目錄太抓,res里面有values layout等文件夾,資源文件可以通過recipe里的merge命令合并到我們項目中的res目錄下令杈。源代碼文件通過instantiate命令重命名并遷移到對應(yīng)目錄下走敌。這里的所有文件后綴名都是ftl。

#TempMvpActivity.java.ftl
package ${packageName};

/**
 * @author lsp
 * @created 17/3/3 16:38
 */
public class ${activityClass}Activity extends Activity{
  
}

打開我們的一個activity文件逗噩,其中代碼部分跟我們自己寫的activity是一樣的掉丽,只是需要替換掉的部分用變量替換掉就可以在通過模版生成代碼時候自動讀取變量生成對應(yīng)的文件以及代碼了。

globals.xml.ftl

globals文件是用來定義全局變量以及引入系統(tǒng)預(yù)設(shè)全局變量的

#globals.xml.ftl
<?xml version="1.0"?>
<globals>
    <global id="hasNoActionBar" type="boolean" value="false" />
    <#include "../common/common_globals.xml.ftl" />
</globals>

我們也可以自己在這里定義我們需要的變量异雁,然后通過$(hasNoActionBar)這樣的方式來進行調(diào)用捶障。
include的通用目錄在

/Applications/Android Studio.app/Contents/plugins/android/lib/templates/activities/common

recipe.xml.ftl

recipe文件是用來實際操作生成模版的,他包含了一系列操作標(biāo)簽:

#recipe.xml.ftl
<?xml version="1.0"?>
<recipe>
    <#include "recipe_manifest.xml.ftl" />

    //把string合并到項目中的strings中
        <merge from ="root/res/values/strings.xml.ftl"
                to="${escapeXmlAttribute(resOut)}/values/strings.xml"/>

    //合并代碼
    <instantiate from = "root/src/TempMvpActivity.java.ftl"
                 to ="${escapeXmlAttribute(srcOut)}/${activityClass}Activity.java"/>

    <instantiate from = "root/src/TempMvpComponent.java.ftl"
                     to ="${escapeXmlAttribute(srcOut)}/${activityClass}Component.java"/>

    <instantiate from = "root/src/TempMvpFragment.java.ftl"
                     to ="${escapeXmlAttribute(srcOut)}/${activityClass}Fragment.java"/>

    <instantiate from = "root/src/TempMvpModule.java.ftl"
                         to ="${escapeXmlAttribute(srcOut)}/${activityClass}Module.java"/>

    <instantiate from = "root/src/TempMvpPresenter.java.ftl"
                         to ="${escapeXmlAttribute(srcOut)}/${activityClass}Presenter.java"/>

    <instantiate from = "root/src/TempMvpView.java.ftl"
                         to ="${escapeXmlAttribute(srcOut)}/${activityClass}View.java"/>


    <instantiate from="root/res/layout/activity_mvp.xml.ftl"
            to="${escapeXmlAttribute(resOut)}/layout/${activityLayoutName}.xml" />

    <instantiate from="root/res/layout/fragment_mvp.xml.ftl"
                to="${escapeXmlAttribute(resOut)}/layout/${fragmentLayoutName}.xml" />

    //打開指定文件
    <open file="${escapeXmlAttribute(srcOut)}/${activityClass}Activity.java" />

</recipe>

上面這個是我生成模版用的纲刀,里面包含的標(biāo)簽如下:

  • <#include> 是引入其他的配置文件的项炼,我這里用到了AndroidManifest的合并,所以我把合并的文件引入進來示绊。當(dāng)然AndroidManifest的合并操作直接在該文件里面寫也是沒問題的芥挣。
  • copy
<copy from="root/res/drawable-hdpi"
to="${escapeXmlAttribute(resOut)}/drawable-hdpi" />

這個操作符可以把我們模版里的資源文件復(fù)制到對應(yīng)的項目資源目錄下

  • merge
<merge from ="root/res/values/strings.xml.ftl"
to="${escapeXmlAttribute(resOut)}/values/strings.xml"/>

我們可以通過這個操作符對資源文件進行合并,比如strings耻台,AndroidManifest文件等。

  • instantiate
<instantiate from = "root/src/TempMvpPresenter.java.ftl"
 to ="${escapeXmlAttribute(srcOut)}/${activityClass}Presenter.java"/>

這個操作符很常用到空另,是用來把我們的ftl文件進行一系列處理(變量替換盆耽,文件名重命名,去掉ftl后綴)并copy到指定的位置。這個是生成我們模版文件以及代碼的主要操作摄杂。(freemarker)

  • open
<open file="${escapeXmlAttribute(srcOut)}/${activityClass}Activity.java" />

在代碼生成后坝咐,打開指定的文件

template.xml

這個文件是用來定義新建時候的輸入項的。

template3.jpeg
<parameter
      id="activityClass"
      name="Activity Name"
      type="string"
      constraints="class|unique|nonempty"
      suggest="${layoutToActivity(activityLayoutName)}"
      default="MvpActivity"
      help="The name of the activity class to create"/>
  • id :通過該標(biāo)識析恢,獲取輸入的內(nèi)容$(activityClass)
  • name:輸入框左邊的提示語
  • type : 輸入值類型 可以為string或者boolean
  • constraints:填寫值的約束墨坚,比如不能為空,是否唯一
  • suggest:建議值
  • default:默認(rèn)值
  • help:輸入框獲取焦點時底部顯示的提示語

這個文件里定義的每一項都會在新建時候展示出來讓使用者輸入或者選擇映挂。然后對應(yīng)的變量會在生成模版時候使用泽篮。

freemarker

在我們編寫模版時候使用到的freemarker,可以通過以下文章進行了解

坑點

總體來說模版的編寫還是很簡單的柑船。想要的功能大多可以在預(yù)設(shè)模版中找到帽撑。把需要使用的功能從預(yù)設(shè)模版中copy過來修改就可以了。

  • 在合并AndroidManifest的時候一直提示合并沖突鞍时,AndroidManifest合并到項目中就在</manifest>標(biāo)簽外了亏拉。最后查出來是我編寫模版Manifest文件時少了一個>符號。所以對于沒有l(wèi)int檢查的ftl文件寫的時候一定要注意好仔細(xì)一點逆巍,否則會導(dǎo)致意想不到的問題及塘。
  • 由于需要生成的類有點多,統(tǒng)一命名的時候需要用freemarker來對輸入的字符串進行處理锐极,如果用法不對就會導(dǎo)致創(chuàng)建時候androidstudio卡死笙僚。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市溪烤,隨后出現(xiàn)的幾起案子味咳,更是在濱河造成了極大的恐慌,老刑警劉巖檬嘀,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件槽驶,死亡現(xiàn)場離奇詭異,居然都是意外死亡鸳兽,警方通過查閱死者的電腦和手機掂铐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揍异,“玉大人全陨,你說我怎么就攤上這事≈灾溃” “怎么了辱姨?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長戚嗅。 經(jīng)常有香客問我雨涛,道長枢舶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任替久,我火速辦了婚禮凉泄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蚯根。我一直安慰自己后众,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布颅拦。 她就那樣靜靜地躺著蒂誉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪矩距。 梳的紋絲不亂的頭發(fā)上拗盒,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音锥债,去河邊找鬼陡蝇。 笑死,一個胖子當(dāng)著我的面吹牛哮肚,可吹牛的內(nèi)容都是我干的登夫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼允趟,長吁一口氣:“原來是場噩夢啊……” “哼恼策!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起潮剪,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤涣楷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后抗碰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狮斗,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年弧蝇,在試婚紗的時候發(fā)現(xiàn)自己被綠了碳褒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡看疗,死狀恐怖沙峻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情两芳,我是刑警寧澤摔寨,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站怖辆,受9級特大地震影響祷肯,放射性物質(zhì)發(fā)生泄漏沉填。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一佑笋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧斑鼻,春花似錦蒋纬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荒叶,卻和暖如春碾阁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背些楣。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工脂凶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人愁茁。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓蚕钦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鹅很。 傳聞我的和親對象是個殘疾皇子嘶居,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容