美文网首页
freemarker 模板

freemarker 模板

作者: Demons_96 | 来源:发表于2020-11-18 20:30 被阅读0次

freemarker 模板

目录

  • 简介
  • 文件结构
  • 参考

简介

Android Studio 提供了不少模板,包括 Activity、Fragment、Service 等,缩短了开发者创建工程以及编写相似代码的时间,我们可以需求在 Android Studio 里编写相应的代码模板。

这些模板是使用 FreeMarker 编写的,它是一款模板引擎,支持使用 XML 来配置模板信息,生成输出文本(HTML网页、电子邮件、配置文件、源代码等)。

文件结构

  1. 在 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 等模板
  1. 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">
}

参考

相关文章

网友评论

      本文标题:freemarker 模板

      本文链接:https://www.haomeiwen.com/subject/ihwkiqtx.html