android studio自定义模板实践

为了提高自己的开发效率,学习如何自定义模板还是很重要的。比如:有好几种方式的引导页,如果想集成到自己的类库中会发现不知如何取舍,全部加入太臃肿,不加入,下一次集成浪费时间多,最好是自己搞个模板高大上。

引用参考资料:
Android Studio自定义模板 写页面竟然可以如此轻松
Android Studio 模板(Template)定制
自定义Android Studio工程模板
个人认为最详细的:Android ADT Template Format Document

Android studio 内置属性与函数

recipe.xml.ftl中输出路径,使用escapeXmlAttribute(xx)函数:

  • srcOut:src文件夹,
  • projectOut:该工程(app/moudle)的顶级路径:libs,build.gradle,.gitignore等
  • manifestOut:AndroidManifest.xml
  • resOut:res文件夹的输出drawable,mipmap
  • 测试:testOut,unitTestOut

以上需要考虑系统是否有定义,否则需要在globals.sml.ftl中进行定义:

1
2
3
4
5
6
7
8
<global id="topOut" value="." />
<global id="projectOut" value="." />
<global id="manifestOut" value="${manifestDir}" />
<global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
<global id="testOut" value="androidTest/${slashedPackageName(packageName)}" />
<global id="unitTestOut" value="${escapeXmlAttribute(projectOut)}/src/test/java/${slashedPackageName(packageName)}" />
<global id="resOut" value="${resDir}" />
<global id="mavenUrl" value="mavenCentral" />

EmptyActivity为例

该模板的具体路径为:

SDK_INSTALL_LOCATION\plugins\android\lib\templates

该目录的文件解释:

  • template.xml

    定义新建工程面板上所显示的内容(是否生成对应的layout)

  • globals.xml.ftl

    指定工程跟目录和mavenUrl属性

  • recipe.xml.ftl

    指定需要依赖的一些文件

  • root文件夹 存放对应源码的ftl文件,以及资源文件
  • 效果缩略图

template.xml部分标签介绍

  • id :唯一标识,最终通过该属性的值,获取用户输入值(文本框内容,是否选中)
  • name:界面上的类似label的提示语
  • type : 输入值类型
  • constraints:填写值的约束
  • suggest:建议值,比如填写ActivityName的时候,会给出一个布局文件的建议值。
  • default:默认值
  • help:底部显示的提升语

recipe.xml.ftl部分标签介绍

  • copy :从root中copy文件到我们的目标目录,比如我们的模板Activity需要使用一些图标,那么可能就需要使用copy标签将这些图标拷贝到我们的项目对应文件夹。
  • merge : 合并的意思,比如将我们使用到的strings.xml合并到我们的项目的stirngs.xml中
  • instantiate : 和copy类似,但是可以看到上例试将ftl->java文件的,也就是说中间会通过一个步骤,将ftl中的变量都换成对应的值,那么完整的流程是ftl->freemarker process -> java
  • open:在代码生成后,打开指定的文件,比如我们新建一个Activity后,默认就会将该Activity打开

Freemarker语法

语法还是很简单很类似的,学过一门语言即可入手了。

资料:
FreeMarker语法知识

  • 当前时间获取:使用.now函数,根据${.now?date}来更改格式

Built-ins for date/time/date-time values

  • 注释:<#---->

实现继承基类的方式

通过查看common_globas.xml.ftl知道superClass的来由,而且经过实现发现只有定义id=parentActivityClass才会有选择框,至于为什么?暂时还不知道。所以…

思路是:通过parentActivityClass得到基类的路径,通过对字符串分割得到对应的类和包。
对应资料:
freemarker中的split字符串分割
FreeMarker内置命令(字符串命令)
freemarker中的indexOf