模板编写
效果
- 学习LoginActivity模板
首先我们打开studio安装目录找到系统原生模板,D:\Program Files\Android\studio\plugins\android\lib\templates\activities 这个是我的安装目录,在这里我们可以看到很多原生模板代码可以参考及借鉴,下面我们举例将
LoginActivity
用sublimeText
打开,如果本地没有请自行下载
在这里我们可以看到root
文件下存放的是res
和src
两个文件夹对应的就是我们在开发时的目录这里不过多解释,
global
:里面存放的是全局变量recipe
:这个文件会去获取template
文件的id
然后去创建相对应模板template
:给使用模板用户所看到的页面
- 自己编写一个简单mvp模板
- 首先我们去创建一个模板名称为
mvp
,接着打开template
文件我们设置下name
和description
<template
format="5"
revision="1"
name="Mvp"
description="第一个插件模板的诞生之路1">
<category value="Activity"/>
<formfactor value="Mobile"/>
</template>
这时在通过studio工具查看模板就会发现刚才自定义模板已经生成了可以在studio->new->Activity中查看到。
- 下面我们创建
MvpLoginActivity
的模板,打开template.xml
<parameter
id="activityClass"
name="Activity Name"
type="string"
constraints="class|nonempty"
help="hexl 测试模板 Activity"/>
- 打开
recipe.xml.ftl
文件
<#-- 创建一个实例
from:从指定路径下引入该模板文件,相关模板代码都将在该文件中创建
to:输出到指定的目录
mvpPath、 相当于变量,该变量在global文件中进行定义
-->
<instantiate from="root\src\app_package\LoginActivity.java.ftl"
to="${mvpPath}ui/activity/${activityClass}Activity.java"/>
<#-- 打开创建的文件 -->
<open file="${mvpPath}ui/activity/${activityClass}Activity.java"/>
在这里我们看到有两个变量分别是mvpPath
和activityClass
两个变量,mvpPath
在globals.xml.ftl
定义
<global id="mvpPath" type="string" value="${escapeXmlAttribute(srcOut)}/mvp/"/>
activityClass
就是引用template.xml
定义的activity ID
。
Presenter
和Model
都是一样的代码可以创建出来,这里不再展示章尾会给出源码
- 类名与Layout联动
- Activity和Layout名称联动
我们要实现输入类名时布局名称也随之联动,主要看下suggest
这个参数
<!-- 创建布局 -->
<parameter
id="layoutActivityClass"
name="Activity Layout"
constraints="layout|nonempty"
default="activity_main"
suggest="${activityToLayout(activityClass)}"
help="hexl 测试模板 Layout"/>
- Fragment和Layout名称联动
<!-- 创建Fragment -->
<parameter
id="fragmentClass"
name="Fragment Name"
type="string"
constraints="class|nonempty"
help="hexl 测试模板 Fragment"/>
<!-- 创建布局
Fragment 布局名称联动与Activity 不一样,需要特别注意
-->
<parameter
id="layoutFragmentClass"
name="Fragment Layout"
constraints="layout|nonempty"
default="fragment_main"
suggest="fragment_${classToResource(fragmentClass)}"
help="hexl 测试模板 Layout"/>
- Adapter和itemLayout名称联动
<parameter
id="adapterClass"
name="Adapter Name"
type="string"
constraints="class|nonempty"
help="Adapter 将被输出到 package.adapter 下"/>
<!--
adapter item 名称联动与fragment和activity都不一样
规范是 item_$小写adapterClass
-->
<parameter
id="adapterLayoutClass"
name="Adapter Layout Name"
type="string"
suggest="item_${extractLetters(commonName?lower_case)}"
constraints="class|nonempty"
visibility="needAdapterLayout"
help="AdapterLayout 布局文件将被输出到 res/layouts/items/ 下"/>
这里用到了commonName
,所以我们要在template
定义出来
<!-- 公共名称 -->
<parameter
id="commonName"
name="Common Name"
type="string"
constraints="nonempty"
help="公共名称,作为所有页面的前缀"
default="Hexl"/>
<instantiate from="root/src/app_package/LoginAdapter.java.ftl"
to="${mvpPath}/adapter/${commonName}Adapter.java"/>
创建layout布局文件
<instantiate from="root/res/layout/simple.xml.ftl"
to="${escapeXmlAttribute(resOut)}/layout/${adapterLayoutClass}.xml"/>
这里引入了一个simple.xml.ftl文件其实很简单,只要在root->res->layout
目录下进行声明就ok了
- 生成不同级别目录
例如我们将adapter放到与mvp同一级别目录下,而不是在mvp目录下我们该如何进行骚操作呢?
首先我们在global.xml.ftl
文件中定义个变量
<global id="adapterPath" type="string" value="${escapeXmlAttribute(srcOut)}/adapter/"/>
然后修改recipe.xml.ftl
文件输出的目录
<instantiate from="root/src/app_package/LoginAdapter.java.ftl"
to="${adapterPath}/${commonName}Adapter.java"/>