freemarker 模板

freemarker 模板

目錄

  • 簡介
  • 文件結(jié)構
  • 參考

簡介

Android Studio 提供了不少模板,包括 Activity、Fragment、Service 等,縮短了開發(fā)者創(chuàng)建工程以及編寫相似代碼的時間,我們可以需求在 Android Studio 里編寫相應的代碼模板。

這些模板是使用 FreeMarker 編寫的,它是一款模板引擎,支持使用 XML 來配置模板信息,生成輸出文本(HTML網(wǎng)頁、電子郵件、配置文件、源代碼等)。

文件結(jié)構

  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:可創(chuàng)建模板的類型
  • other:Fragment、View、Service 等模板
  1. 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 的內(nèi)容,然后通過 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ù)} (引用內(nèi)容:類名 activityClass 、包名 packageName)

<#if 變量> (判斷)

</#if> (結(jié)束判斷)

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">
}

參考

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容