freemarker 模板
目录
- 简介
- 文件结构
- 参考
简介
Android Studio 提供了不少模板,包括 Activity、Fragment、Service 等,缩短了开发者创建工程以及编写相似代码的时间,我们可以需求在 Android Studio 里编写相应的代码模板。
这些模板是使用 FreeMarker 编写的,它是一款模板引擎,支持使用 XML 来配置模板信息,生成输出文本(HTML网页、电子邮件、配置文件、源代码等)。
文件结构
- 在 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:可创建模板的类型
- other:Fragment、View、Service 等模板
- Activity 模板下的文件
以 \activities\EmptyActivity 文件为例
- template.xml:模板填写文件,定义创建模板时所需要的属性。
<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:参数名 -->
<!-- type:参数类型 -->
<!-- constraints:参数填写是的约束类型|唯一|非空 -->
<!-- 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 界面显示给开发者。
- 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:制作模板的实体
${数据} (引用内容:类名 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 官网
网友评论