freemarker 模板
目錄
- 簡介
- 文件結構
- 參考
簡介
Android Studio 提供了不少模板喷屋,包括 Activity、Fragment养盗、Service 等诉植,縮短了開發(fā)者創(chuàng)建工程以及編寫相似代碼的時間,我們可以需求在 Android Studio 里編寫相應的代碼模板阁谆。
這些模板是使用 FreeMarker 編寫的碳抄,它是一款模板引擎,支持使用 XML 來配置模板信息场绿,生成輸出文本(HTML網(wǎng)頁剖效、電子郵件、配置文件焰盗、源代碼等)璧尸。
文件結構
- 在 Android Studio 里的路徑
- Windows: Android Studio 安裝目錄\plugins\android\lib\templates\activities
- Mac Os: Android Studio 安裝目錄\Contents\plugins\android\lib\templates\activities
- activities:Activity 模板
- gradle:默認的 gradle-wrapper 文件
- gradle-projects:可創(chuàng)建模板的類型
- other:Fragment、View熬拒、Service 等模板
- Activity 模板下的文件
以 \activities\EmptyActivity 文件為例
- template.xml:模板填寫文件爷光,定義創(chuàng)建模板時所需要的屬性。
<template
format="5"
revision="5"
name="Empty Activity"
minApi="9"
minBuildApi="14"
description="Creates a new empty activity">
<!-- name:模板名稱 -->
<!-- description:模板描述 -->
<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" />
<!-- name:參數(shù)名 -->
<!-- type:參數(shù)類型 -->
<!-- constraints:參數(shù)填寫是的約束類型|唯一|非空 -->
<!-- default:默認值 -->
<!-- help:提示的幫助信息 -->
<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" />
<!-- visibility:是否顯示 -->
<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="backwardsCompatibility"
name="Backwards Compatibility (AppCompat)"
type="boolean"
default="true"
help="If false, this activity base class will be Activity instead of AppCompatActivity" />
<parameter
id="packageName"
name="Package name"
type="string"
constraints="package"
default="com.mycompany.myapp" />
....
</template>
Android Studio 會解析 template.xml 的內容澎粟,然后通過 UI 界面顯示給開發(fā)者蛀序。
- 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" />
<!-- Android 模板默認提供的全局變量文件 -->
<#include "../common/common_globals.xml.ftl" />
</globals>
- recipe.xml.ftl:模板文件操作邏輯
<?xml version="1.0"?>
<#import "root://activities/common/kotlin_macros.ftl" as kt>
<recipe>
<#include "../common/recipe_manifest.xml.ftl" />
<@kt.addAllKotlinDependencies />
<#if generateLayout>
<#include "../common/recipe_simple.xml.ftl" />
<open file="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
</#if>
<instantiate from="root/src/app_package/SimpleActivity.${ktOrJavaExt}.ftl"
to="${escapeXmlAttribute(srcOut)}/${activityClass}.${ktOrJavaExt}" />
<open file="${escapeXmlAttribute(srcOut)}/${activityClass}.${ktOrJavaExt}" />
</recipe>
- root:制作模板的實體
${數(shù)據(jù)} (引用內容:類名 activityClass 、包名 packageName)
<#if 變量> (判斷)
</#if> (結束判斷)
package ${packageName};
import ${superClassFqcn};
import android.os.Bundle;
import android.view.View;
<#if (includeCppSupport!false) && generateLayout>
import android.widget.TextView;
</#if>
public class ${activityClass} extends ${superClass} {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
<#if generateLayout>
setContentView(R.layout.${layoutName});
<#include "../../../../common/jni_code_usage.java.ftl">
<#elseif includeCppSupport!false>
// Example of a call to a native method
android.util.Log.d("${activityClass}", stringFromJNI());
</#if>
}
public void onClick(View view) {
switch (view.getId()) {
default:
break;
}
}
<#include "../../../../common/jni_code_snippet.java.ftl">
}
參考
- Android 組件化架構-第七章-7.7.1 模板基礎
- freemarker 官網(wǎng)