android studio簡單使用(A):自定義模版介紹

因為暫時還沒有考慮好順序谐算,先用A表示


前言

自己也沒有怎么接觸過android studio的模版
只是參考 鴻洋 的博客簿姨,接觸到了, 自己記錄一下
具體參考:
https://github.com/WanAndroid/AndroidStudioTemplates

(后面
http://robusttechhouse.com/tutorial-how-to-create-custom-android-code-templates/
里面有說 用 freemarker 体啰,最后生成java代碼外傅, freemarker記得之前的公司,Spring的頁面有用到鳄哭,感覺頁面填充數(shù)據(jù)都差不多)


參考網站

鴻洋博客指向的github地址
https://github.com/WanAndroid/AndroidStudioTemplates
參考的是


自己參考

先參考


簡單說明

Paste_Image.png
Paste_Image.png

這里大體的意思是要糊,
通過開始做的參數(shù),去做 recipe的執(zhí)行
執(zhí)行是將【前面的參數(shù)】妆丘,【recipe模版】和【Activity模版】锄俄,通過FreeMarker生成對應的 java文件


android studio中模版的位置

在 AndroidStudioXXXPath\plugins\android\lib\templates\中, 有對應的代碼
以Activity為例:
我們打開android studio后勺拣, 在 File -- New -- Activity 中奶赠,可以看見很多可以選的Activity, 會顯示顯示符合條件的Activity模版


Paste_Image.png

AndroidStudioXXXPath\plugins\android\lib\templates\activities 中药有,有

Paste_Image.png

我們可以對比毅戈,基本一樣的(文件夾中,有幾個沒有顯示而已)


對應的文件

我們以 EmptyActivity 為例:
(因為自己猜測, 空的應該是最簡單的)

Paste_Image.png

我們可以看見苇经,對應的結構
大體為:

  • root 文件夾
  • 2個ftl模版文件
  • 1個xml文件
  • 一張圖片

我們用大圖看一下

Paste_Image.png

在把miniSdk赘理, 新建 EmptyActivity , 可以看見對應的頁面

Paste_Image.png

(對應的圖片塑陵,和文件夾中的圖片是一樣的)


EmptyActivity 文件概要
  • root 文件夾
  • 2個ftl模版文件
  • 1個xml文件
  • 一張圖片

我們先看一下

template.xml

<?xml version="1.0"?>
<template
    format="5"
    revision="5"
    name="Empty Activity"
    minApi="7"
    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" />

    <parameter
        id="generateLayout"
        name="Generate Layout File"
        type="boolean"
        default="true"
        help="If true, a layout file will be generated" />

    <parameter
        id="layoutName"
        name="Layout Name"
        type="string"
        constraints="layout|unique|nonempty"
        suggest="${activityToLayout(activityClass)}"
        default="activity_main"
        visibility="generateLayout"
        help="The name of the layout to create for the activity" />

    <parameter
        id="isLauncher"
        name="Launcher Activity"
        type="boolean"
        default="false"
        help="If true, this activity will have a CATEGORY_LAUNCHER intent filter, making it visible in the launcher" />
    
    <parameter
        id="packageName"
        name="Package name"
        type="string"
        constraints="package"
        default="com.mycompany.myapp" />

    <!-- 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>

一半猜測感憾,一半看文檔吧
先自己猜測一下(感覺代碼都是差不多的蜡励,很多時候好的結構令花,可以猜到大概)
這是一個標準的xml

最外面 template, 可以猜測到

  • name: 名字凉倚, Empty Activity兼都,新建的時候,顯示的內容
  • minApi:最低api的版本(我們可以發(fā)現(xiàn)稽寒,gradle對應的版本如果寫得過低扮碧,對應的模版是灰色不能選擇的)
  • minBuildApi:最低的編譯版本(同上)
  • description:描述,應該是顯示在對話框中顯示的描述

其他的變量:
category:類型杏糙,這里是 Activity
thumbs:android慎王,java,maven都會見過宏侍,對應的thumbnail赖淤,縮略圖,這里指向當前文件夾的一個文件(我們可以發(fā)現(xiàn)谅河,如果修改名字后咱旱,新建模版就不會顯示圖片了)
globals:globals.xml.ftl,主觀感覺绷耍,應該是一些全局的變量或者文件
execute:recipe.xml.ftl吐限,主觀感覺,應該是執(zhí)行相關的

其他parameter們:
parameter:自己感覺就是對應的變量褂始,別的地方可以使用的
一共有的parameter(3個string類型诸典, 2個boolean類型)

  • activityClass: string 【Activity Name】
  • generateLayout:boolean【Generate Layout File】
  • layoutName:string 【Layout Name】
  • isLauncher:boolean【Launcher Activity】
  • packageName:string 【Package name】
Paste_Image.png

對應一下,上圖
發(fā)現(xiàn)全部可以對應上崎苗, 并且默認值搂赋,可以里面的默認值是一樣的


globals.xml.ftl

<?xml version="1.0"?>
<globals>
    <global id="hasNoActionBar" type="boolean" value="false" />
    <global id="parentActivityClass" value="" />
    <global id="simpleLayoutName" value="${layoutName}" />
    <global id="excludeMenu" type="boolean" value="true" />
    <global id="generateActivityTitle" type="boolean" value="false" />
    <#include "../common/common_globals.xml.ftl" />
</globals>

前面幾個 global id,應該都是 參數(shù)map益缠,存放對應的id脑奠,type和value
最后有一個include
android,或者html頁面幅慌,都經常用到的關鍵字
我們找一下對應的位置: ../common/common_globals.xml.ftl
( 無論是linux宋欺,php,win,貌似都一樣齿诞,/ 開頭酸休,表示絕對路徑; 其他表示相對路徑)
我們到父文件夾找到common文件夾
找到對應的文件

Paste_Image.png

common_globals.xml.ftl

<globals>
    <#assign theme=getApplicationTheme()!{ "name": "AppTheme", "isAppCompat": true }>
    <#assign themeName=theme.name!'AppTheme'>
    <#assign themeNameNoActionBar=theme.nameNoActionBar!'AppTheme.NoActionBar'>
    <#assign appCompat=theme.isAppCompat!false>
    <#assign appCompatActivity=appCompat && (buildApi gte 22)>

    <global id="themeName" type="string" value="${themeName}" />
    <global id="implicitParentTheme" type="boolean" value="${(themeNameNoActionBar?starts_with(themeName+'.'))?string}" />
    <global id="themeNameNoActionBar" type="string" value="${themeNameNoActionBar}" />
    <global id="themeExistsNoActionBar" type="boolean" value="${(theme.existsNoActionBar!false)?string}" />
    <global id="themeNameAppBarOverlay" type="string" value="${theme.nameAppBarOverlay!'AppTheme.AppBarOverlay'}" />
    <global id="themeExistsAppBarOverlay" type="boolean" value="${(theme.existsAppBarOverlay!false)?string}" />
    <global id="themeNamePopupOverlay" type="string" value="${theme.namePopupOverlay!'AppTheme.PopupOverlay'}" />
    <global id="themeExistsPopupOverlay" type="boolean" value="${(theme.existsPopupOverlay!false)?string}" />

    <global id="appCompat" type="boolean" value="${((isNewProject!false) || (theme.isAppCompat!false))?string}" />
    <global id="appCompatActivity" type="boolean" value="${appCompatActivity?string}" />
    <global id="hasAppBar" type="boolean" value="${appCompatActivity?string}" />
    <global id="hasNoActionBar" type="boolean" value="${appCompatActivity?string}" />
    <global id="manifestOut" value="${manifestDir}" />
    <global id="buildVersion" value="${buildApi}" />

<#if !appCompat>
    <global id="superClass" type="string" value="Activity"/>
    <global id="superClassFqcn" type="string" value="android.app.Activity"/>
    <global id="Support" value="" />
    <global id="actionBarClassFqcn" type = "string" value="android.app.ActionBar" />
<#elseif appCompatActivity>
    <global id="superClass" type="string" value="AppCompatActivity"/>
    <global id="superClassFqcn" type="string" value="android.support.v7.app.AppCompatActivity"/>
    <global id="Support" value="Support" />
    <global id="actionBarClassFqcn" type = "string" value="android.support.v7.app.ActionBar" />
<#else>
    <global id="superClass" type="string" value="ActionBarActivity"/>
    <global id="superClassFqcn" type="string" value="android.support.v7.app.ActionBarActivity"/>
    <global id="Support" value="Support" />
    <global id="actionBarClassFqcn" type = "string" value="android.support.v7.app.ActionBar" />
</#if>

    <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
    <global id="resOut" value="${resDir}" />
    <global id="menuName" value="${classToResource(activityClass!'')}" />
    <global id="simpleName" value="${activityToLayout(activityClass!'')}" />
    <global id="relativePackage" value="<#if relativePackage?has_content>${relativePackage}<#else>${packageName}</#if>" />
</globals>

我們可以發(fā)現(xiàn)更多的global參數(shù)祷杈,存放的map值


recipe.xml.ftl

recipe.xml.ftl

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

<#if generateLayout>
    <#include "../common/recipe_simple.xml.ftl" />
    <open file="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
</#if>

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

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

我們發(fā)現(xiàn)被 recipe 包裹斑司,

  • 有2個#include, 也就是對應 父文件夾下common文件夾的recipe_manifest.xml.ftl但汞,recipe_simple.xml.ftl宿刮,對應的文件
    (具體就不跟了,應該也是添加對應的recipe相關的內容)

  • 第2個include前面私蕾,有一個 #if僵缺, 應該是判斷, 后面這個字符串踩叭,如果大家觀察前面文件仔細的話磕潮,在template.xml的parameter中有對應的值,默認為true

  • 后面大體應該是打開文件容贝,創(chuàng)建文件等操作自脯, 創(chuàng)建實例

    <instantiate from="root/src/app_package/SimpleActivity.java.ftl"
    to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />就是

應該就是打開 root下面唯一的SimpleActivity.java.ftl 模版文件,復制到對應template.xml的parameter為activityClass的值的文件中


簡單總結

還是最上面的圖


Paste_Image.png
Paste_Image.png

第一個圖:
通過開始做的參數(shù)斤富,去做 recipe的執(zhí)行
也就是膏潮,在 template.xml 顯示界面,并且獲得對應參數(shù)的value茂缚,和globals.xml.ftl里面的value一起去做Recipe執(zhí)行操作

第二個圖:
執(zhí)行是將【前面的參數(shù)】戏罢,【recipe模版】和【Activity模版】,通過FreeMarker生成對應的 java文件
這里圖中 MyActivity.java.ftl 就是 上面例子中 SimpleActivity.java.ftl 文件

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末脚囊,一起剝皮案震驚了整個濱河市龟糕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悔耘,老刑警劉巖讲岁,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衬以,居然都是意外死亡缓艳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門看峻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阶淘,“玉大人,你說我怎么就攤上這事互妓∠希” “怎么了坤塞?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長澈蚌。 經常有香客問我摹芙,道長,這世上最難降的妖魔是什么宛瞄? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任浮禾,我火速辦了婚禮,結果婚禮上份汗,老公的妹妹穿的比我還像新娘盈电。我一直安慰自己,他們只是感情好裸影,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布挣轨。 她就那樣靜靜地躺著军熏,像睡著了一般轩猩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荡澎,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天均践,我揣著相機與錄音,去河邊找鬼摩幔。 笑死彤委,一個胖子當著我的面吹牛,可吹牛的內容都是我干的或衡。 我是一名探鬼主播焦影,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼封断!你這毒婦竟也來了斯辰?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤坡疼,失蹤者是張志新(化名)和其女友劉穎彬呻,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柄瑰,經...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡闸氮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了教沾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒲跨。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖授翻,靈堂內的尸體忽然破棺而出或悲,到底是詐尸還是另有隱情镐作,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布隆箩,位于F島的核電站该贾,受9級特大地震影響,放射性物質發(fā)生泄漏捌臊。R本人自食惡果不足惜杨蛋,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望理澎。 院中可真熱鬧逞力,春花似錦、人聲如沸糠爬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽执隧。三九已至揩抡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間镀琉,已是汗流浹背峦嗤。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屋摔,地道東北人烁设。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像钓试,于是被迫代替她去往敵國和親装黑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內容