[Android記錄]自定義ADT模板

簡介

ADT模板就是在Eclipse中使用嚮導新建Android工程或者Android組件的時候使用的模板。ADT模板的特色:

1.能夠經過簡單的可視化配置[後面稱之爲UI parameters]來生成Android代碼和資源樣本
2.集成到Eclipse ADT中
3.FreeMarker驅動 html

Android的默認模板

SDK下載完成以後,通常自帶了一部分模板,模板的位置爲:
$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的基本狀況都是同樣的。 java

模板的工做流程



模板的具體構成

下面結合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自帶的,一個是咱們剛纔建立的,這裏再次代表文件夾的名字和模板名字是兩碼事。


咱們查看一下新工程的大體目錄結構:
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

能夠說是模板的模板,定義了模板的流 程框架 基本結構:
<?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],簡單示例: android

<global id="resOut" value="res" />
<global id="menuName" value="${classToResource(activityClass)}" />
其餘文件中的引用方式就是${resOut}以及${menuName}等等

recipe.xml.ftl
菜單模板,名字挺形象的,定義流程執行的步驟,一個典型的recipe.xml.ftl文件:
<?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的屬性值: app

<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添加下面的內容:
<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  框架

<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修改相應的名稱 eclipse

globals.xml.ftl ide

<global id="xe_prefix" value="xe" />
recipe.xml.ftl:
<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:
@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》
相關文章
相關標籤/搜索