原文地址: juejin.im/post/5c7339…

在平时的开发工作中,我们经常将一个地方的代码,复制粘贴到另外一个地方,俗称搬砖,搬砖搬多了,作为一个资深的挨踢民工,难免会总结一些提高生产力的搬砖经验

Android Studio 模板是个提高生产力的好东西,使用过 MVPArms 的朋友,都应该使用过我提供的配套模板,使用该套模板,一键即可生成整个页面需要的所有文件,甚至还可以一键生成整个 Module,真正的解放了大家的双手,让大家的双手可以去做更多热爱的事情

Android Stuidio 模板一共有 4 种类型,分别对应不同的功能,我先来简单介绍下这 4 种模板,最后再着重介绍下一键生成 Module 的模板,因为前面 3 种模板在网上有太多优秀的教程了,而 Module 模板的资料非常少,我再重复写一遍前 3 种模板的教程也不一定有别人写得好,意义并不大,所以我前面只做简单介绍,后面会贴出一些教程链接,没了解过的就当科普了,了解过的就直接跳过

Live Templates

Live Templates 的功能主要是根据关键字快速生成代码块

在设置中找到 Live Templates,点击红框中的按钮 "+",即可新建 Live Templates

File Templates

File Templates 顾名思义,主要功能就是一键生成单个文件

在设置中找到 File and Code Templates,点击红框中的按钮 "+",即可新建 File Templates

Activity Templates

Activity Templates 可以一键生成多个文件,但不光可以生成 Activity 文件,还可以根据需求生成任何 Java 文件、XML 文件以及其他类型的文件

新建 Activity Templates 要比上面的两个模板复杂的多,需要使用到 FreeMarker,感兴趣的朋友,可以看看我开源的 Activity Templates,稍微修改一下就能应用到自己的项目当中

module Templates

module Templates 可以一键生成 Module 以及 Module 中所需要的所有文件

module Templates 也是使用 FreeMarker 创建的,如果你能理解 Activity Templates,那你也可以快速的新建一个 module Templates

详解 module Templates

不知道大家了解过一键生成 Module 的 Android Stuidio 模板吗,这种类型的模板我在网上没搜到有相关的开源库和文章,所以我就自己研究了一段时间,在去年就开源给了 MVPArms 的使用者

Module Templates 其实要比 Activity Templates 简单很多,因为 Module Templates 的某些限制,导致它的配置面板不能自定义一些新增的功能,所以复杂性降低很多,但是功能性和灵活性就要弱于 Activity Templates,不过即使这样也能满足我们大部分的需求了

Android Studio 中所有的 module Templates 都放在 gradle-projects 这个目录中(Android Studio 安装目录/plugins/android/lib/templates/gradle-projects),如果按照很多教程中对 Activity Templates 学习方法的描述,我们应该按照和 Activity Templates 一样的学习方式,打开 gradle-projects 目录中的 NewAndroidModule 进行学习

但是我可以告诉大家,在你没有足够经验的情况下,最好不要这样做,因为这个文件夹中包含着 Android Studio 创建 Android Module 所需要的所有文件和代码,里面比较复杂,有很多判断条件,很多东西对你的项目来说都用不到,在学习时会耽误你很多时间

所以为了让大家快速上手,我就用我已经开源的 module Templates 作为学习案例,里面的所有文件和代码都是经过我筛选过后提取出来的,非常易于大家学习和理解

module Templates 结构

NewArmsComponent
├── root
│   ├── res //Module 中的资源文件都放这里
│   ├── ├── anim
│   ├── ├── layout
│   ├── ├── mipmap-hdpi
│   ├── ├── mipmap-xhdpi
│   ├── ├── mipmap-xxhdpi
│   ├── ├── mipmap-xxxhdpi
│   ├── ├── values
│   ├── src/app_package   //Module 中的源文件模板都放这里
│   ├── ├── ActivityLifecycleCallbacksImpl.java.ftl
│   ├── ├── Api.java.ftl
│   ├── ├── AppLifecyclesImpl.java.ftl
│   ├── ├── ...
│   ├── test/app_package   //Module 中的测试文件模板都放这里
│   ├── ├── ExampleInstrumentedTest.java.ftl
│   ├── ├── ExampleUnitTest.java.ftl
│   ├── AndroidManifest.xml.ftl   //AndroidManifest.xml 模板文件
│   ├── CMakeLists.txt.ftl   //不用 CMake 可以忽略
│   ├── build.gradle.ftl   //App build.gradle 模板文件
│   ├── native-lib.cpp.ftl   //不用 C 可以忽略
│   ├── root-build.gradle.ftl   //根目录 build.gradle 模板文件
│   ├── settings.gradle.ftl   //settings.gradle 模板文件
├── globals.xml.ftl
├── recipe.xml.ftl
├── template.xml
├── template_new_project.png
复制代码

root 文件夹下包含的是生成 Module 所需要的模板文件,template_new_project.png 是模板的封面图,globals.xml.ftl 我们暂时用不到,recipe.xml.ftl、template.xml 这两个文件存放的是模板的配置参数,是整个模板的核心文件,我们来看看这两个文件

template.xml

template.xml 放置的是配置面板的参数,配置面板是什么东西?看下图

module Templates 和 Activity Templates 的配置面板不一样,Activity Templates 可以任意修改和新增配置面板中的项目,但是 module Templates 不可以,只能固定为图中的这四项

看看 template.xml 里面的内容

<?xml version="1.0"?>
<templateformat="5"revision="2"name="MVPArms Module"description="Creates a new MVPArms Module."><category value="Application" /><formfactor value="Things" />----------------------- 分割线 -----------------------<thumbs><thumb>template_new_project.png</thumb></thumbs><parameterid="packageName"name="Package name"type="string"constraints="app_package|nonempty"default="com.mycompany.myapp" />...<globals file="globals.xml.ftl" /><execute file="recipe.xml.ftl" />
</template>
复制代码

只用看分割线以上的标签即可,下面的标签基本用不上,每个 parameter 标签在配置面板中都对应一个项目,但 parameter 标签只在 Activity Templates 中可以任意修改和新增,在 module Templates 中的任何修改和新增都是无效的,这点大家可以试试

name 标签和 description 标签顾名思义,这就不用多解释了,category 标签固定为 Application 即可

这里要特别要提一下 formfactor 标签,在 NewAndroidModule 中,formfactor 标签的值为 Mobile,最开始我也和它一样,将值赋为 Mobile,结果发现无法生成文件,我想可能是 Android Studio 只允许存在一个 Android 的 Module 模板,我又试着改成了 TV、Glass、Wear ...,发现都不完美,要不是无法生成文件,要不就生成太多不需要的文件,最后改成 Things 后,效果就接近完美了

recipe.xml.ftl

recipe.xml.ftl 的功能就是告诉模板引擎,你打算怎么处理你的模板文件

<?xml version="1.0"?>
<!-- TODO: check include Cpp support; add driver module template -->
<recipe><mkdir at="${escapeXmlAttribute(projectOut)}/libs" /><mkdir at="${escapeXmlAttribute(resOut)}/anim" /><mkdir at="${projectOut}/src/main/java/${slashedPackageName(packageName)}/app/utils" /><merge from="root/settings.gradle.ftl"to="${escapeXmlAttribute(topOut)}/settings.gradle" /><merge from="root/root-build.gradle.ftl"to="${escapeXmlAttribute(topOut)}/build.gradle" /><copy from="root/res/mipmap-hdpi/ic_launcher.png"to="${escapeXmlAttribute(resOut)}/mipmap-hdpi/ic_launcher.png" /><copy from="root/res/mipmap-xhdpi/ic_launcher.png"to="${escapeXmlAttribute(resOut)}/mipmap-xhdpi/ic_launcher.png" /><copy from="root/res/mipmap-xxhdpi/ic_launcher.png"to="${escapeXmlAttribute(resOut)}/mipmap-xxhdpi/ic_launcher.png" /><copy from="root/res/mipmap-xxxhdpi/ic_launcher.png"to="${escapeXmlAttribute(resOut)}/mipmap-xxxhdpi/ic_launcher.png" />                  <instantiate from="root/build.gradle.ftl"to="${escapeXmlAttribute(projectOut)}/build.gradle" /><instantiate from="root/AndroidManifest.xml.ftl"to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" /><instantiate from="root/res/values/styles.xml.ftl"to="${escapeXmlAttribute(resOut)}/values/styles.xml" /><instantiate from="root/src/app_package/GlobalConfiguration.java.ftl"to="${projectOut}/src/main/java/${slashedPackageName(packageName)}/app/GlobalConfiguration.java" /><open file="${projectOut}/src/main/java/${slashedPackageName(packageName)}/app/GlobalConfiguration.java" /><instantiate from="root/src/app_package/AppLifecyclesImpl.java.ftl"to="${projectOut}/src/main/java/${slashedPackageName(packageName)}/app/AppLifecyclesImpl.java" /><open file="${projectOut}/src/main/java/${slashedPackageName(packageName)}/app/AppLifecyclesImpl.java" /><#if unitTestsSupported><instantiate from="root/test/app_package/ExampleUnitTest.java.ftl"to="${escapeXmlAttribute(unitTestOut)}/ExampleUnitTest.java" />
</#if>
</recipe>
复制代码

Module 所需要的模板文件都放在 root 文件夹下,而使用 recipe.xml.ftl 中的标签就是为了告诉模版引擎,你打算将哪个模板文件通过什么方式放到 Module 中的什么位置

mkdir 标签,顾名思义,就是生成一个空的文件夹

merge 标签中的 from 填写模板文件的地址,to 填写 Module 中的目标位置,merge 标签会将 from 中填写的模板文件,放到 to 中填写的目标位置上,如果目标位置已经存在一个相同文件名的文件,则将模板文件中的全部内容复制到已经存在的文件中,否则则创建一个新的文件

copy 标签会将 from 中填写的文件,放到 to 中填写的目标位置上,如果目标位置已经存在一个相同文件名的文件,则会覆盖此文件

instantiate 标签会将 from 中填写的模板文件,放到 to 中填写的目标位置上,如果目标位置已经存在一个相同文件名的文件,则会覆盖此文件,看描述和 copy 标签差不多,那它们的区别是什么呢?

copy 标签的目标对象是普通文件,也就是没有 .ftl 后缀的文件,instantiate 标签的目标对象是模板文件,也就是有 .ftl 后缀的文件,那有 .ftl 后缀的文件和没有 .ftl 后缀的文件有什么区别呢?

有 .ftl 后缀的文件中可以使用 FreeMarker 语法,在生成文件时,模版引擎会根据文件中的 FreeMarker 语法对文件内容进行相应的修改,比如根据不同的条件生成不同的内容,而没有 .ftl 后缀的文件,文件中的内容一旦确定在生成时是无法改变的,就如同单纯的复制粘贴

${escapeXmlAttribute(resOut)} 对应的是 Module 中的 res 文件夹

{slashedPackageName(packageName)} 对应的是包名下的根目录

${escapeXmlAttribute(topOut)} 对应的是整个工程的根目录

${escapeXmlAttribute(projectOut)} 对应的是 Module 的根目录

{escapeXmlAttribute(testOut)} 对应的是 Module 中放置测试文件的文件夹

模板文件

root 文件夹下模板文件的编写也不难,因为 module Templates 没有用到自定义变量,所以大多数情况下,就是将你写好的 java 文件,后面加上 .ftl 后缀即可,看看下面我贴出的源代码链接,你很快就能上手

你如果还想学到更多的 FreeMarker 语法,可以翻翻下面贴出的 FreeMarker 中文文档

开源代码链接

我给 MVPArms 写的 File Templates

我给 MVPArms 写的 Activity Templates

我给 MVPArms 写的 module Templates

我给组件化项目写的 module Templates

教程链接

快速写出 Activity Templates 的插件

Live Templates 教程

File Templates 教程

Activity Templates 教程

FreeMarker 中文文档

提高开发效率之安卓模板(上面有四种模板的教程,我之前会两种,看完之后还是只会两种2333)相关推荐

  1. Android Studio 2.0:速度提升,极大提高开发效率

    转至:http://android.jobbole.com/82127/ Android Studio 2.0:速度提升,极大提高开发效率 11月24日,在 Android Developer Sum ...

  2. 可以500%提高开发效率的前端UI框架!QUI!

    QUI 框架介绍 QUI网页界面集成框架是一套完整的企业级前端解决方案,由组件库.皮肤框架.示例工程和文档4部分组成.使用本产品开发者可以极大地减少工作量,提高开发效率,快速构建功能强大.美观.兼容的 ...

  3. 星图地球开发者平台,真的能提高开发效率吗?

    最近发现一款新的数据可视化应用系统的搭建平台,叫星图地球开发者平台(GEOVIS Earth Dev). 一听这个名字就知道,这是面向开发者的.没错,这个产品是星图地球发布的基于数字地球的低代码.一站 ...

  4. Android开发: 分享利用好Kotlin的特点提高开发效率

    Kotlin-first but not kotlin-must 谷歌在 I/O 大会上宣布,Kotlin 编程语言现在是 Android 应用程序开发人员的首选语言后,有更多的安卓程序投入Kotli ...

  5. 低代码开发如何提高开发效率和降低成本

    低代码星球 点击上方蓝字 · 关注我们 CLICK THE BLUE WORD TO FOLLOW US 识别二维码加入我们 加入低码星球微信群 与低码爱好者交流 低代码开发已经成为软件开发中一股不可 ...

  6. “六神”——技术提高开发效率的一个方案

    这个方案并不是我在系统设计方面的最早一次尝试.但它在提高开发效率方面,是效果最为显著的一个方案. 简介 "六神"框架提供了一套简单而通用的.从Web层到数据库操作(增加单个数据.删 ...

  7. 什么样的鼠标对程序员最有用,超级提高开发效率

    目录 学会使用鼠标左边的两个按键,提高开发效率 .今天给大家分享一个鼠标小技巧,先看下图 这两个键非常有用,可能很多人还不知道怎么用他,加上很多公司都配置很普通的鼠标,根本没有这个两个按钮. 那这两个 ...

  8. 能够提高开发效率的Eclipse实用操作

    概要: 工欲善其事,必先利其器.对于程序员来说,Eclipse便是其中的一个"器".本文会从 Eclipse快捷键和实用技巧这两个篇章展开介绍.Eclipse快捷键用熟后,不用鼠标 ...

  9. 如何通过组件化提高开发效率?

    在软件开发过程中,大到业务模块的划分,小到技术组件的开发,都属于组件化的思考范畴内.很多时候我们到网上搜索「组件化」关键词,都只会看到关于前端组件化的资料,而对于后台开发组件化的资料却很少,那这是不是 ...

最新文章

  1. 上帝和面向对象的七天
  2. pandas demo 示例
  3. Selenium自动写公众号文章
  4. 小红书回应赴港IPO:暂无明确计划
  5. 中国数据总线电缆市场趋势报告、技术动态创新及市场预测
  6. Python类、模块、包的概念及区别
  7. Shell脚本学习-阶段六-密钥的批量分发与执行
  8. Spring Boot 整合 docker
  9. python中实参必须是常量吗_7 python函数参数(必须参数、可变参数、关键字参数)...
  10. 制作电脑显示器流光溢彩
  11. 一些div垂直居中的方法
  12. java面试,经常遇到面试官的问题
  13. 04- kubeadm init流程
  14. 基于单片机的气象监测系统
  15. 【踩坑】Linux java中ftp下载文件,解压文件损坏,以及图片下载打开只显示下载路径的问题
  16. duilib适配高分屏(高DPI适配)
  17. CentOS搭建代理服务器
  18. 计算机天文应用与计算专业,专业介绍-中国科学院国家天文台南京天文光学技术研究所...
  19. i711800h和r54600h哪个好
  20. CUDA安装失败,解决办法

热门文章

  1. 产品经理经验谈50篇(四):数据分析常用方法及应用案例解析
  2. 地图自定义编码CSV转换成ini文件
  3. 开源项目成熟度分析工具-利用github api获取代码库的信息
  4. Best practice for JVM Tuning[转]
  5. 美团点评业务之技术解密,日均请求数十亿次的容器平台
  6. 手动修改user-agent
  7. 【Python】Jupyter notebook
  8. 织梦调用css的标签,织梦dede常用的调用标签(个人总结)
  9. [搜索]波特词干(Porter Streamming)提取算法详解(1)
  10. Java 8 - 数值流Numberic Stream