Android記錄]自定義ADT模板

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 IDE 
FreeMarker 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)}" />
其他文件中的引用方式就是${resOut}以及${menuName}等等 

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的類名" />
2.一般我不會直接使用android默認的titlebar,而會自己定義一個TextView來定製title,因此我希望在嚮導中添加一個Page Title配置項,在template.xml添加下面的內容: 
?
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}" />
3.app中會引用其他的一些庫,這些庫通常也會帶有很多activity佈局文件,爲了和自己的佈局文件去分開,所以我通常在自己的佈局文件前面添加一個前綴,可以這麼修改: 
(1)定義一個前綴全局變量 

(2)分別在template.xml和recipe.xml.ftl修改相應的名稱

globals.xml.ftl

?
1
<global id="xe_prefix" value="xe" />
recipe.xml.ftl: 
?
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》
發佈了19 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章