内容简介:最近项目在搞组件化,基本改造已完成(解耦什么的真的是体力活呀!因为项目比较庞大,所以老代码决定还是放着不动,有时间有人力再搞,新的大功能以组件化的方式开发),但是创建新的组件模块要拷贝很多相似的配置和代码,鉴于IDEA强大的模板功能,决定把这块给自动化了。位于一开始,自定义模板的时候使用的
最近项目在搞组件化,基本改造已完成(解耦什么的真的是体力活呀!因为项目比较庞大,所以老代码决定还是放着不动,有时间有人力再搞,新的大功能以组件化的方式开发),但是创建新的组件模块要拷贝很多相似的配置和代码,鉴于IDEA强大的模板功能,决定把这块给自动化了。
符合我们要求的自定义模板分两类:
1. Module 模板
位于 <AS安装目录>/plugins/android/lib/templates/gradle-project
下,创建Application或者Module,类型只有固定的几类, category
为 Application
, formfactor
为:
- Mobile : 移动端应用
- Wear : 可穿戴设备的应用
- Car : 车载应用
- TV : 电视应用
- Things : 物联网应用
一开始,自定义模板的时候使用的 Mobile
,不生效,发现 Mobile
只认一个;按照JavaLibrary的写法,去掉 formfactor
,发现也只认一个;后来改成 Things
才可以。
Module模板在创建的时候,无法像页面模板那样,在Create Dialog中添加自定义参数,让用户选填,这个有点坑。
2. 页面模板
位于 templates/activities
下,在module中创建特定的文件或目录,这种模板可以在Create Dialog中添加自定义的参数。
目录结构
templateName ├--- template.xml 模板入口配置文件 ├--- globals.xml 可供模板使用的全局预设变量 ├--- recipe.xml 操作清单 └--- <其他文件/目录> 模板源文件
1. template.xml
这是当前模板的入口配置文件。下面稍微介绍下一些重要的tag和字段。
<template>
tag:
-
format
模板格式版本号,和templates目录中其他模板一样就好,当前是5,如果大于android plugin定义的CURRENT_FORMAT,该模板将会被跳过。 -
revision
模板版本号,如果有重名的模板(模板文件不仅可以放在<AS安装目录>/plugins/android/lib/templates
下,还可以放在<用户主目录>/.android/templates
目录下),取版本号最高的那个,如果相等,取修改时间最新的那个 -
name
、description
属性标明了该模板显示的名称和描述。
<category>
tag的 value
属性,标明该模板对应的分类:
-
Application
:创建project或者module
这种模板一般放在templates/gradle-project下
通过File -> New -> New Project… / New Module… 进行创建 -
Activity
:创建Activity的
这种模板一般放在templates/activities下
通过右击module -> New -> Activity 进行创建 -
Xml
、Fragment
、Service
、Folder
、Other
等:创建其他文件的模板
这种模板一般放在templates/other下
通过右击module -> New -> 选择对应的分类进行创建
<formfactor>
tag的 value
属性,标明模板的二级分类,参见
<thumbs>
& <thumb>
指定该模板的图标,图标文件一般和template.xml同级
<parameter>
tag标明当前模板自定义的参数
如果是project & module类的模板( category
为 Application
),这些参数都是定死的,创建模板的界面也是定死的,我们无法自定义添加。但是其他的category类型(包括自定义category),这些参数都会在UI上展现,可以让用户输入。tag中的属性简介:
id name type default
<globals>
tag的 file
属性,指定了全局配置文件(一般为globals.xml.ftl),模板文件中可用的全局参数都可以写到这个文件中。
<execute>
tag的 file
属性,指定了模板的创建清单(一般为recipe.xml.ftl),这个文件中注明了生成哪些文件、目录,以及怎么生成。
2. globals.xml.ftl
该文件定义了模板中可用的全局参数,系统预定义的参数可以参看这个 链接 。
<global>
tag定义了一个全局参数:
-
id
:模板中引用时用到的参数名 -
type
: 数据类型(可选) -
value
:参数值
这里可以通过${name}的方式,引用系统预定义的参数,而且,系统还预定义一些方法可供使用,具体参见这个 链接
3. recipe.xml.ftl
这个文件中通过tag操作符的方式指明了需要生成哪些文件,以及怎么生成,可用的tag如下:
<mkdirat="somewhere"/> 创建 somewhere 目录 <instantiatefrom="A.ftl"to="...B"/> 解析A.ftl模板并生成为工程中的...B文件 <copyfrom="A"to="…B"/> 将A文件拷贝为工程中的…B文件,纯拷贝(不做模板解析) <appendfrom="A"to="…B"/> 将A文件追加到工程中的…B文件最后(不做模板解析) <mergefrom="A.ftl"to="…B"/> 解析A.ftl模板并合并到工程中的…B文件,只有xml和gradle文件才能用<merge> <openfile="…B"/> 在AS中打开工程中的…B文件
以下是gradle相关的tag:
<applyplugin="…"/> 应用某个gradle插件 <classpathmavenUrl="…"/> 添加某个mavenUrl到classpath <dependencymavenUrl="…"/> 添加某个依赖
这个文件中也可以使用系统预定义的 参数 、 方法 以及globals.xml.ftl中定义的参数、FreeMarker的语法。
举个:chestnut:
gradle-project/DemoTemplate ├--- template.xml ├--- globals.xml ├--- recipe.xml ├--- mobile-module.png //tempalte的缩略图,从别的template里拷贝一个就好 └--- root ├--- AndroidManifest.xml.ftl ├--- build.properties.ftl ├--- settings.gradle.ftl └--- res └--- values └--- strings.xml.ftl
template.xml
<?xml version="1.0"?> <template format="5" revision="2" name="Demo Module Template" description="Create a Demo Template Module."> <!-- Module 级别的模板 --> <categoryvalue="Application"/> <!-- 类别为 Things --> <formfactorvalue="Things"/> <!-- Create Dialog 上显示的预览图 --> <thumbs> <thumb>mobile-module.png</thumb> </thumbs> <!-- 以下都是一些默认参数 --> <parameter id="packageName" name="Package name" type="string" constraints="app_package|nonempty" default="com.your.myapp" /> <parameter id="appTitle" name="Module Name" type="string" constraints="nonempty" default="module_" /> <parameter id="minApi" name="Minimum API level" type="string" constraints="apilevel" default="8" /> <!-- Usually the same as minApi, but when minApi is a code name this will be the corresponding API level --> <parameter id="minApiLevel" name="Minimum API level" type="string" constraints="apilevel" default="8" /> <parameter id="targetApi" name="Target API level" type="string" constraints="apilevel" default="19" /> <!-- Usually the same as targetApi, but when targeting a preview platform this is the code name instead --> <parameter id="targetApiString" name="Target API" type="string" constraints="apilevel" default="19" /> <parameter id="buildApi" name="Build API level" type="string" constraints="apilevel" default="19" /> <!-- Usually the same as buildApi, but when targeting a preview platform this is the code name instead --> <parameter id="buildApiString" name="Build API level" type="string" constraints="apilevel" default="19" /> <parameter id="makeIgnore" name="Create .gitignore file" type="boolean" default="true" /> <globalsfile="globals.xml.ftl"/> <executefile="recipe.xml.ftl"/> </template>
globals.xml.ftl
<?xml version="1.0"?> <globals> <!-- 项目根目录 --> <globalid="topOut"value="."/> <!-- Module根目录 --> <globalid="projectOut"value="."/> <globalid="srcOut"value="${srcDir}/${slashedPackageName(packageName)}"/> <globalid="manifestOut"value="${manifestDir}"/> <globalid="resOut"value="${resDir}"/> </globals>
recipe.xml.ftl
<?xml version="1.0"?> <recipe> <!-- 在Module的根目录下,创建 libs 和 drawable 目录 --> <mkdirat="${escapeXmlAttribute(projectOut)}/libs"/> <mkdirat="${escapeXmlAttribute(resOut)}/drawable"/> <!-- 合并 settings.gradle --> <mergefrom="root/settings.gradle.ftl" to="${escapeXmlAttribute(topOut)}/settings.gradle" /> <!-- 根据当前template的root/build.gradle.ftl,初始化Module的build.grale --> <instantiatefrom="root/build.gradle.ftl" to="${escapeXmlAttribute(projectOut)}/build.gradle" /> <!-- 初始化AndroidManifest.xml --> <instantiatefrom="root/AndroidManifest.xml.ftl" to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" /> <!-- 初始化strings.xml --> <instantiatefrom="root/res/values/strings.xml.ftl" to="${escapeXmlAttribute(resOut)}/values/strings.xml" /> <#if!createActivity> <mkdirat="${escapeXmlAttribute(srcOut)}"/> </#if> <#ifmakeIgnore> <copyfrom="root://gradle-projects/common/gitignore" to="${escapeXmlAttribute(projectOut)}/.gitignore" /> </#if> <#include"root://gradle-projects/common/proguard_recipe.xml.ftl"/> </recipe>
root/AndroidManifest.xml.ftl
<manifestxmlns:android="http://schemas.android.com/apk/res/android" package="${packageName}" />
root/build.gradle.ftl
apply plugin: 'com.android.library' android { compileSdkVersion <#if buildApiString?matches("^\\d+$")>${buildApiString}<#else>'${buildApiString}'</#if> <#if explicitBuildToolsVersion!false>buildToolsVersion "${buildToolsVersion}"</#if> defaultConfig { minSdkVersion <#if minApi?matches("^\\d+$")>${minApi}<#else>'${minApi}'</#if> targetSdkVersion <#if targetApiString?matches("^\\d+$")>${targetApiString}<#else>'${targetApiString}'</#if> versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } }
root/settings.gradle.ftl
include ':${projectName}'
root/res/values/string.xml.ftl
<resources> <stringname="app_name">${escapeXmlString(appTitle)}</string> </resources>
设置好以后,重启Studio,然后 File -> New —> New Module..
应该就能弹出创建的对话框了
参考
以上所述就是小编给大家介绍的《Android Studio Module&页面 自定义模板》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 自定义 Xcode 文件模板
- PyCharm 自定义文件和代码模板
- 10 - 页面侧边栏:使用自定义模板标签
- 10 - 页面侧边栏:使用自定义模板标签
- MoliCode 2.0 发布,自定义模板代码生成
- 使用自定义文件模板加快你的应用开发速度
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。