ADT模板就是在Eclipse中使用嚮導新建Android工程或者Android組件的時候使用的模板。ADT模板的特點:
1.可以通過簡單的可視化配置[後面稱之爲UI parameters]來生成Android代碼和資源樣本
2.集成到Eclipse ADT中
3.FreeMarker驅動
Android的默認模板
SDK下載完成之後,一般自帶了一部分模板,模板的位置爲:
1
|
$your_android_sdk_dir/tools/templates |
模板的類型有:
1.Android Application Templates
這個模板是使用Eclipse的新建Android工程嚮導[包括Android project,lib project和test project]時使用的模板類型
2.Android Activity Templates
這個顯然就是使用Eclipse的新建Android Activity嚮導時使用的模板類型
3.Android Object Templates
這個就是創建其他一些android組件嚮導時使用的一些模板[File -> New -> Other -> Android/Android Object 可以打開此類嚮導]
Activity示例
打開新建Android Activity嚮導,ADT插件首先就會列出一些可選模板讓我們選擇,如下:
我們再打開$your_android_sdk_dir/tools/templates/activities文件夾,會發現正好和嚮導的選擇一一對應,不過要指出的是,模板文件夾的名字並不是模板的名字,這裏只是恰好一樣而已。
至於其他的Application Templates和Object Templates的基本情況都是一樣的。
模板的工作流程
模板的具體構成
下面結合Activity模板來稍微說明下。開始之前,除了必要的Eclipse + ADT plugin + Android SDK,我們需要一個輔助工具——FreeMarker IDEFreeMarker IDE是個eclipse的插件,安裝過程在FreeMarker的官網有介紹。
官方提供的模板就是最好的資料,爲了避免破壞原有的模板,我們新建一個模板工程:
File -> New -> Project -> General/Project:
把新工程Xe_CustomActivity建立在了SDK的templates裏面,然後將BlankActivity文件夾中的內容拷貝到新工程裏面,這樣就可以在eclipse裏面直接使用了。
我們重複一下上面的使用嚮導創建Activity的步驟,會發現有兩個BlankActivity,其中一個是SDK自帶的,一個是我們剛纔創建的,這裏再次表明文件夾的名字和模板名字是兩碼事。
我們查看一下新工程的大致目錄結構:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
project_name: ...root ......AndroidManifest.xml.ftl ......res .........layout ............*.ftl/*.* ......src .........app_package ............*.ftl/*.* ...template.xml ...recipe.xml.ftl ...globals.xml.ftl ...*.png |
附帶說明:.ftl表示FreeMarker模板語言
文件說明
template.xml
可以說是模板的模板,定義了模板的流 程框架 基本結構:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<? xml
version = "1.0" ?> < template format = "3" revision = "2" name = "Blank
Activity"
<!-- 在嚮導中顯示的模板名稱 --> description="Creates
a new blank activity, with an action bar and optional navigational elements such as tabs or horizontal swipe."> < dependency
name = "android-support-v4"
revision = "8"
/> < category
value = "Activities"
/> <!--
模板類型 --> < parameter id = "activityClass"
<!-- 參數名,在ftl文件中可以用${activityClass}獲取參數值 --> name="Activity
Name" <!--
UI 界面輸入框前的提示標籤值 --> type="string"
<!--
參數值類型 --> constraints="class|unique|nonempty"
<!--
參數值約束條件,這裏的約束是必須是類名,唯一,非空 --> suggest="${layoutToActivity(layoutName)}"
<!--
自動提示,比如輸入layout的值可以自動生成activityClass --> default="MainActivity"
<!--默認值
--> help="The
name of the activity class to create" /> <!--
嚮導對話框底部的幫助性文字 --> < thumbs > < thumb >template_blank_activity.png</ thumb > < thumb
navType = "none" >template_blank_activity.png</ thumb > < thumb
navType = "tabs" >template_blank_activity_tabs.png</ thumb > < thumb
navType = "tabs_pager" >template_blank_activity_tabs_pager.png</ thumb > < thumb
navType = "pager_strip" >template_blank_activity_pager.png</ thumb > < thumb
navType = "dropdown" >template_blank_activity_dropdown.png</ thumb > </ thumbs > < globals
file = "globals.xml.ftl"
/> < execute
file = "recipe.xml.ftl"
/> </ template > |
幾個重要的節點:
category節點:表示模板的類型,可選的值包括三種:
1.Applications表示Android Application Templates
2.Activities表示Android Activities Templates
3.UI Component表示Android Object Templates中那些帶有試圖的UI組件模板,所以類似Service這種沒有界面的組件模板中就沒有這個節點了。
parameter節點:定義了圖形配置界面的用戶輸入參數項。
參數類型由parameter節點的type屬性定義,常見的類型有:
string——表現爲輸入框
boolean——表現爲勾選框
enum——表現爲下拉選擇框
thumbs節點:定義了靜態預覽圖。
對照Activity嚮導可以很容易的知道各個節點的意思:
<globals file="globals.xml.ftl" />就是將工程定義的全局變量包含進來。
<execute file="recipe.xml.ftl" />表示開始執行模板渲染。
因此,template.xml的結構和作用可以描述爲:
globals.xml.ftl
這個文件的目的只有一個,就是提供全局變量[Global Values],簡單示例:
1
2
|
< global
id = "resOut"
value = "res"
/> < global
id = "menuName"
value = "${classToResource(activityClass)}"
/> |
recipe.xml.ftl
菜單模板,名字挺形象的,定義流程執行的步驟,一個典型的recipe.xml.ftl文件:
1
2
3
4
5
6
7
8
9
10
11
12
|
<? xml
version = "1.0" ?> < recipe > < merge
from = "AndroidManifest.xml.ftl"
/> < copy
from = "res/values-v14/styles_ics.xml" to = "res/values-v14/styles.xml"
/> < instantiate
from = "res/menu/main.xml.ftl" to = "res/menu/${menuName}.xml"
/> < open
file = "res/layout/${layoutName}.xml"
/> </ recipe > |
可以看到recipe.xml.ftl使用了許多變量[後文稱之爲模板變量],那麼這些變量來自那些地方呢?主要來自兩個方面:
1.UI Parameters
2.Global Values
模板變量數據流向
定製化自己的ADT模板,簡單上手
1.我們將所有的模板幫助提示都改成中文,在template.xml文件中,主要是修改description的屬性值:
1
2
3
4
5
6
7
8
|
< parameter id = "activityClass" name = "Activity名稱" type = "string" constraints = "class|unique|nonempty" suggest = "${layoutToActivity(layoutName)}" default = "MainActivity" help = "Activity的類名"
/> |
1
2
3
4
5
6
7
8
|
< parameter id = "pageTitle" name = "My
Page Title" type = "string" constraints = "nonempty" default = "默認標題" suggest = "${activityClass}_page_title" help = "自定義頁面的標題"
/> |
在默認的activity佈局文件[可以是root/res/layout/activity_simple.xml.ftl]中添加一個TextView
1
2
3
4
5
|
< TextView android:background = "#ff5500" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:text = "${pageTitle}"
/> |
(1)定義一個前綴全局變量
(2)分別在template.xml和recipe.xml.ftl修改相應的名稱
globals.xml.ftl
1
|
< global
id = "xe_prefix"
value = "xe"
/> |
1
2
3
4
|
< instantiate
from = "res/menu/main.xml.ftl" to = "${resOut}/menu/${xe_prefix}_${menuName}.xml"
/> < instantiate
from = "res/layout/activity_simple.xml.ftl" to = "${resOut}/layout/${xe_prefix}_${layoutName}.xml"
/> |
root/src/app_package/SimpleActivity.java.ftl:
1
2
3
4
5
6
7
8
9
|
@Override protected
void
onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.${xe_prefix}_${layoutName}); <# if
parentActivityClass != "" > //
Show the Up button in the action bar. setupActionBar(); </# if > } |
附錄
1,classToResource等方法定義在ADT插件中,具體源碼:https://android.googlesource.com/platform/sdk/+/7dd444ea0125e50a5e88604afb6de43e80b7c270/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt
2,FreeMarker參考 http://freemarker.org/index.html ,中文文檔: http://jaist.dl.sourceforge.net/project/freemarker/chinese-manual/FreeMarker_Manual_zh_CN.pdf
參考 《Custom Android Code Templates》