freemarker ftl模板_效率提升百分之四十,AS模板也太好用了吧

c4415060dfe57ec1d1154ca64d97d4a3.gif

点击蓝字 轻松关注

CV 工程师你好,以下内容会让你感觉到不适,慎入!

8d10e1ea425ca05a20255396ad6f42ff.png

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

6e7c9477095a69e3e4b865fa4d84487e.png

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

2e9595aa47cd035e488e929a124d79a0.png

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

6f9c42dd76fa154357da9f464080d321.png

现在还差几个 star 就超过 Mozilla 在模板语言 Freemarker 中排名 star 全球第一了,让我得瑟一下?

a0d9a5aed7d0da26482e7be3ae27cd68.png

Live Templates

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

bfad9d1f717f6d540fd766dbca862755.gif

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

44a4e98241cc5ab84a2c67f4dbabe9af.png

File Templates

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

f90082416f5e2475a1874c011303c71b.gif

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

d35876bfec0c0f924d99b3223cca097c.png

Activity Templates

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

ad3dc73c3513244d559d4ed63ff7da4f.gif

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

Module Templates

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

6702f7ddd6f9c5274003f97ce3a54ff5.gif

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 进行学习

58e2b1b6edbabd81d661e9bcba405798.png

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

7aaab3af3689f0dedaee39ea722d86b1.png

所以为了让大家快速上手,我就用我已经开源的 Module Templates(https://github.com/JessYanCoding/MVPArms-Module-Template) 作为学习案例,里面的所有文件和代码都是经过我筛选过后提取出来的,非常易于大家学习和理解

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 放置的是配置面板的参数,配置面板是什么东西?看下图

ab4e98233f79fb50972140ce4be8efd7.png

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.pngthumb>
    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"?>

<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 文件夹

${projectOut}/src/main/java/${slashedPackageName(packageName)} 对应的是包名下的根目录

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

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

${escapeXmlAttribute(manifestOut)} 对应的是放置 AndroidManifest.xml 的文件夹

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

模板文件

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

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

开源代码链接

我给 MVPArms 写的 File Templates:

https://github.com/JessYanCoding/MVPArms/blob/master/MVP_generator_solution

我给 MVPArms 写的 Activity Templates:

https://github.com/JessYanCoding/MVPArmsTemplate

我给 MVPArms 写的 Module Templates:

https://github.com/JessYanCoding/MVPArms-Module-Template

我给组件化项目写的 Module Templates:

https://github.com/JessYanCoding/ArmsComponent-Template

教程链接

快速写出 Activity Templates 的插件:

https://www.jianshu.com/p/e3548f441440

Live Templates 教程:

https://www.jianshu.com/p/065877f0c33d

File Templates 教程:

https://www.jianshu.com/p/57e734864b46

Activity Templates 教程:

https://blog.csdn.net/lmj623565791/article/details/51635533

FreeMarker 中文文档:

http://freemarker.foofun.cn/toc.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python for循环连续输入五个成绩判断等级_Python基础(1)——输入输出/循环/条件判断/基本数据类型...

一、编程语言 1、 编译型语言&#xff1a;先编译&#xff0c;再执行 &#xff08;先编译成二进制&#xff09; 举例&#xff1a;英文书翻译成中文再看 C、C、C# 2、解释型语言&#xff1a;一边执行一边编译 举例&#xff1a;英文书找个翻译&#xff0c;它翻译一行你听一行 php、…

笔记本计算机无法开机怎么办,笔记本开机没反应,教您笔记本电脑开不了机怎么处理...

笔记本电脑使用的时间长了&#xff0c;都是会出现一些小故障&#xff0c;大毛病什么的&#xff0c;比如说像开机后&#xff0c;电源指示灯亮&#xff0c;但是电脑的显示器屏就是没有反应。这个问题让用户慌了神&#xff0c;为此&#xff0c;那笔记本电脑开不了机怎么解决&#…

离群点检测方法_干货 :时间序列异常检测

异常检测(Anomaly detection)是目前时序数据分析最成熟的应用之一,定义是从正常的时间序列中识别不正常的事件或行为的过程。有效的异常检测被广泛用于现实世界的很多领域,例如量化交易,网络安全检测、自动驾驶汽车和大型工业设备的日常维护。以在轨航天器为例,由于航天器昂…

centos6安装mysql并远程连接_MySQL5.7数据库安装与远程连接

系统&#xff1a;Redhat Linux 7.7MySQL版本&#xff1a;5.71. MySQL下载o 登录网站&#xff1a;https://dev.mysql.com/downloads/mysql/o 选择合适版本与系统Select version&#xff1a;5.7.31Select operating system&#xff1a;Red Hat Enterprise LinuxSelect OS Version…

python小代码_Python爬虫入门有意思的小长代码

一段有意思的代码&#xff0c;有兴趣的可以研究研究。 需求 用户收到短信如&#xff1a;购买了电影票或者火车票机票之类的事件。然后app读取短信&#xff0c;解析短信&#xff0c;获取时间地点&#xff0c;然后后台自动建立一个备忘录&#xff0c;在事件开始前1小时提醒用户。…

小学生 计算机编程 教程,面向小学生的C ++有趣编程(第一卷)配置教学资源课件完整版...

难度适中&#xff0c;易学易教的“面向小学生的C 趣味编程”教科书是小学信息学教学的重要组成部分.选择80多个接近小学生学习生活的例子&#xff0c;结合小学生的认知规律&#xff0c;激发孩子的兴趣&#xff0c;关注程序&#xff0c;适当削弱语法.使用流程图来阐明思想&#…

python怎么用for循环找出最大值_如何获取Python简单for循环索引

如何获取Python简单for循环索引 这篇文章主要介绍了如何获取Python简单for循环索引,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Python的for循环相比其他语言而言更加简单&#xff0c;比如经常会有如下这样类…

2018年江苏省计算机小高考,江苏2018年小高考成绩查询系统网站入口:江苏省教育考试院...

【导语】无忧考网从江苏省教育考试院获悉&#xff0c;江苏2018年小高考成绩查询系统网站入口将于4月9日上午正式开通&#xff01;江苏省教育考试院关于发布江苏省2018年普通高中学业水平测试必修科目考试成绩的通告江苏省2018年普通高中学业水平测试必修科目考试成绩拟定于4月9…

列注释_【EXCEL检查问题】:如何快速检查并删除EXCEL中隐藏的工作表、行、列等信息...

前注&#xff1a;本案例是以EXCEL2016为示范软件&#xff0c;各版本的部分功能和路径可能不同在EXCEL使用过程中&#xff0c;你是否遇到过某一列的公式怎么修改都报错的情况&#xff1f;你是否遇到过一个只有区区几行数据的表格&#xff0c;却占用了好几百KB甚至好几M的空间呢&…

python输入的字符串转换为对应的数字类型_Python合集之Python运算符(四)

在上一节的合集中&#xff0c;我们了解了Python运算符中的位运算符的相关知识&#xff0c;本节我们将进一步了解一下Python运算符中运算符的优先级级基础的输入输出语法的相关知识。1. 运算符优先级Python运算符的运算规则是&#xff1a;优先级高的运算先执行&#xff0c;优先级…

服务器选购seo优化规则,需要做SEO的网站,购买服务器请注意六点

企业为了能在市场中争抢到一席之地都在对网站做各种优化&#xff0c;期望通过互联网&#xff0c;在最大程度上提高知名度&#xff0c;吸引客户。企业搭建网站一般都会考虑网站上线之后的优化问题&#xff0c;而服务器对于网站SEO的优化有很大的影响。网站想要做好SEO优化&#…

linux unix域socket_python3从零学习-5.8.1、socket—底层网络接口

源代码: Lib/socket.py这个模块提供了访问BSD*套接字*的接口。在所有现代Unix系统、Windows、macOS和其他一些平台上可用。这个Python接口是用Python的面向对象风格对Unix系统调用和套接字库接口的直译&#xff1a;函数 socket() 返回一个 套接字对象 &#xff0c;其方法是对各…

freetype字体位图转距离场_那些火遍ins的字体小技巧,不看你就亏了

转载自版式设计很简单(ID&#xff1a;format_design)今天分享一个台湾设计师施博瀚的学习教程&#xff0c;看了以后&#xff0c;你会惊呼&#xff0c;原来这个是用AI做出来的&#xff1f;Ps.软件截图跟我们有所差别&#xff0c;以文字说明为主。www.instagram.com/bohanshih快速…

已知三角形三点坐标求角度_细心研磨椭圆焦点三角形,这肯定是最全的解释。...

点击上方蓝字关注我因为月考赶上运动会&#xff0c;继国庆之后&#xff0c;感觉又放了一个小长假。原本身体是很愿意的&#xff0c;可是&#xff0c;刚讲的解析几何突然被中断了&#xff0c;思想上还真是有点矛盾。因为&#xff0c;想了想两天后该讲些什么&#xff0c;脑中却一…

社会计算机比赛,哈尔滨工业大学社会计算与信息检索研究中心 – 理解语言,认知社会 » IR-Lab参加计算机学院“光熙杯”篮球赛...

IR-Lab参加计算机学院“光熙杯”篮球赛2014年04月18日迎首战师生一心&#xff0c;IR队旗开得胜 5月11日是“光熙杯”篮球赛的第二个比赛日&#xff0c;IR队迎来了小组赛的首场比赛&#xff0c;对阵空间计算队。比赛开始阶段&#xff0c;双方均略显紧张&#xff0c;然而随着比赛…

12v小型电机型号大全_电机型号参数大全

电动机型号是便于使用、设计、制造等部门进行业务联系和简化技术文件中产品名称、规格、型式等叙述而引用的一种代号。下面为大家介绍电动机型号含义等信息。一、电动机型号组成及含义由电机类型代号、电机特点代号、设计序号和励磁方式代号等四个小节顺序组成。1、类型代号是表…

easycode不推荐使用_为什么?mysql不推荐使用uuid或者雪花id作为主键?

前言&#xff1a;在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究竟有什么坏处&#xff1f;本篇博客我们就来分析这个问题,探讨一下内部的…

netpref 使用_使用PerfView监测.NET程序性能(转发)

原文&#xff1a;前言&#xff1a;在日常项目开发中&#xff0c;我们时不时会遇到程序【占用了很高CPU的】情况&#xff0c;可能是程序里某些未经优化的代码或者Bug&#xff0c;或者是程序运行压力太大。无论是什么原因&#xff0c;我们总希望能看到到底是【哪个方法占用了如此…

ubuntu 虚拟机 串口 socket_上篇 | 虚拟机Ubuntu向开发板AMR传送文件

让技术支撑梦想点击上方蓝字可以关注我们哦首先把Ubuntu向开发板发送文件的流程做一下笔记&#xff0c;下一篇笔记就记录开发板如何接受文件....上一篇笔记&#xff1a;Makefile文件的编写规则及实例有很多小伙伴看不懂术语&#xff0c;所以这次小浩用口语方式表达这次笔记&…

win7 mysql 密码_笔记本win7系统下mysql忘记密码的最佳解决方法

MySQL是一个关系型数据库管理系统&#xff0c;在笔记本win7系统下编程的时候就需要用到MySQL数据库&#xff0c;不过有时候一段时间没用的话&#xff0c;可能会忘记数据库的登录密码了&#xff0c;当忘记密码就无法进入mysql&#xff0c;要如何解决呢&#xff0c;下面给大家带来…