一个简单的示例效果如下
一个 Android Studio Project Template
可以看成是一个 MVC 架构,选择的模版类型和输入的参数最终决定了工程模版中的目录和文件内容。
Apache FreeMarker是编写 AS 模版所采用的模版引擎,利用模版类型和配置信息生成模版,可以将其看成是一个类似SASS
的预处理器,模版中的文件通过 FreeMarker 预处理语言的处理最终生成 AS 中的初始工程文件。FreeMarker 要求在文件后加 ftl 后缀,这些文件中可以使用使用 Java 对象,拥有了一定的动态能力,例如在 AS 模版示例中往往将MainActivity.java
包装成MainActivity.java.ftl
文件。
ftl 预处理文件的好处可以用以下示例来说明
package ${packageName};
public class ${activityClass} extends ${superClass} {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
<#if generateLayout>
setContentView(R.layout.${layoutName});
</#if>
<#include "../../../../common/jni_code_usage.java.ftl">
}
<#include "../../../../common/jni_code_snippet.java.ftl">
}
-
${activityClass}
表示一个变量,这样就可以指定生成活动的名称。 -
${activityToLayout(activityClass)}
其中activityToLayout
是一个内置函数,将类名转为布局文件名。 -
FreeMarker
还可以使用if
和include
语法。
创建模版必须熟悉模版的目录结构,也可以参考已存在的模版。
一些注意点
1.template.xml
文件是根配置文件,其中 parameter
标签的参数 type 可以是 string, boolean, enum 以及 separator,将被渲染成不同的UI控件。
2.globals.xml.ftl
配置文件中存放的是全局变量,大部分来源于Comman
目录中的定义,也可以自定义,全局变量的另一个来源是parameter
标签,如表示活动名的 activityClass
变量就是一个全局变量。
3.recipe.xml.ftl
文件决定了那些文件将参与工程构建,是创建模版的核心。
<instantiate from="root/src/app_package/SimpleActivity.java.ftl"
to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
<open file="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
这里instantiate
表示将使用SimpleActivity.java
文件的包装 ftl 文件做底,在工程的srcOut
目录下生成名为 activityClass(如 MainActivity ) 的活动类。
而open
则表示新建模版工程后将打开该活动,一般应避免打开布局文件。