android studio 使用.a,android studio简单使用(A):自定义模版介绍

因为暂时还没有考虑好顺序,先用A表示

前言

自己也没有怎么接触过android studio的模版

只是参考 鸿洋 的博客,接触到了, 自己记录一下

具体参考:

https://github.com/WanAndroid/AndroidStudioTemplates

参考网站

自己参考

先参考

简单说明

ef5e023c22b8

Paste_Image.png

ef5e023c22b8

Paste_Image.png

这里大体的意思是,

通过开始做的参数,去做 recipe的执行

执行是将【前面的参数】,【recipe模版】和【Activity模版】,通过FreeMarker生成对应的 java文件

android studio中模版的位置

在 AndroidStudioXXXPath\plugins\android\lib\templates\中, 有对应的代码

以Activity为例:

我们打开android studio后, 在 File -- New -- Activity 中,可以看见很多可以选的Activity, 会显示显示符合条件的Activity模版

ef5e023c22b8

Paste_Image.png

AndroidStudioXXXPath\plugins\android\lib\templates\activities 中,有

ef5e023c22b8

Paste_Image.png

我们可以对比,基本一样的(文件夹中,有几个没有显示而已)

对应的文件

我们以 EmptyActivity 为例:

(因为自己猜测, 空的应该是最简单的)

ef5e023c22b8

Paste_Image.png

我们可以看见,对应的结构

大体为:

root 文件夹

2个ftl模版文件

1个xml文件

一张图片

我们用大图看一下

ef5e023c22b8

Paste_Image.png

在把miniSdk, 新建 EmptyActivity , 可以看见对应的页面

ef5e023c22b8

Paste_Image.png

(对应的图片,和文件夹中的图片是一样的)

EmptyActivity 文件概要

root 文件夹

2个ftl模版文件

1个xml文件

一张图片

我们先看一下

template.xml

format="5"

revision="5"

name="Empty Activity"

minApi="7"

minBuildApi="14"

description="Creates a new empty activity">

id="activityClass"

name="Activity Name"

type="string"

constraints="class|unique|nonempty"

suggest="${layoutToActivity(layoutName)}"

default="MainActivity"

help="The name of the activity class to create" />

id="generateLayout"

name="Generate Layout File"

type="boolean"

default="true"

help="If true, a layout file will be generated" />

id="layoutName"

name="Layout Name"

type="string"

constraints="layout|unique|nonempty"

suggest="${activityToLayout(activityClass)}"

default="activity_main"

visibility="generateLayout"

help="The name of the layout to create for the activity" />

id="isLauncher"

name="Launcher Activity"

type="boolean"

default="false"

help="If true, this activity will have a CATEGORY_LAUNCHER intent filter, making it visible in the launcher" />

id="packageName"

name="Package name"

type="string"

constraints="package"

default="com.mycompany.myapp" />

template_blank_activity.png

一半猜测,一半看文档吧

先自己猜测一下(感觉代码都是差不多的,很多时候好的结构,可以猜到大概)

这是一个标准的xml

最外面 template, 可以猜测到

name: 名字, Empty Activity,新建的时候,显示的内容

minApi:最低api的版本(我们可以发现,gradle对应的版本如果写得过低,对应的模版是灰色不能选择的)

minBuildApi:最低的编译版本(同上)

description:描述,应该是显示在对话框中显示的描述

其他的变量:

category:类型,这里是 Activity

thumbs:android,java,maven都会见过,对应的thumbnail,缩略图,这里指向当前文件夹的一个文件(我们可以发现,如果修改名字后,新建模版就不会显示图片了)

globals:globals.xml.ftl,主观感觉,应该是一些全局的变量或者文件

execute:recipe.xml.ftl,主观感觉,应该是执行相关的

其他parameter们:

parameter:自己感觉就是对应的变量,别的地方可以使用的

一共有的parameter(3个string类型, 2个boolean类型)

activityClass: string 【Activity Name】

generateLayout:boolean【Generate Layout File】

layoutName:string 【Layout Name】

isLauncher:boolean【Launcher Activity】

packageName:string 【Package name】

ef5e023c22b8

Paste_Image.png

对应一下,上图

发现全部可以对应上, 并且默认值,可以里面的默认值是一样的

globals.xml.ftl

前面几个 global id,应该都是 参数map,存放对应的id,type和value

最后有一个include

android,或者html页面,都经常用到的关键字

我们找一下对应的位置: ../common/common_globals.xml.ftl

( 无论是linux,php,win,貌似都一样,/ 开头,表示绝对路径; 其他表示相对路径)

我们到父文件夹找到common文件夹

找到对应的文件

ef5e023c22b8

Paste_Image.png

common_globals.xml.ftl

#if>

我们可以发现更多的global参数,存放的map值

recipe.xml.ftl

recipe.xml.ftl

#if>

to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />

我们发现被 recipe 包裹,

有2个#include, 也就是对应 父文件夹下common文件夹的recipe_manifest.xml.ftl,recipe_simple.xml.ftl,对应的文件

(具体就不跟了,应该也是添加对应的recipe相关的内容)

第2个include前面,有一个 #if, 应该是判断, 后面这个字符串,如果大家观察前面文件仔细的话,在template.xml的parameter中有对应的值,默认为true

后面大体应该是打开文件,创建文件等操作, 创建实例

to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />就是

应该就是打开 root下面唯一的SimpleActivity.java.ftl 模版文件,复制到对应template.xml的parameter为activityClass的值的文件中

简单总结

还是最上面的图

ef5e023c22b8

Paste_Image.png

ef5e023c22b8

Paste_Image.png

第一个图:

通过开始做的参数,去做 recipe的执行

也就是,在 template.xml 显示界面,并且获得对应参数的value,和globals.xml.ftl里面的value一起去做Recipe执行操作

第二个图:

执行是将【前面的参数】,【recipe模版】和【Activity模版】,通过FreeMarker生成对应的 java文件

这里图中 MyActivity.java.ftl 就是 上面例子中 SimpleActivity.java.ftl 文件