制作android布局模板,Android模板制作
本⽂详细介绍模板相关的知识和如何制作Android模版及使⽤,便于较少不必要的重复性⼯作。⽐如我在⼯作中如果要创建⼀个新的模块,就不要需要创建MVP相关的⼏个类:Model、View、Presenter、Entity等。
本⽂专门介绍和模板相关的知识,那么问题来了:
模板是什么
模板使⽤位置
模板如何创建(包含模板存放位置)
模板如何使⽤
接下来,我就按照以上顺序为⼤家解读看起来⾼⼤上的模板。
警告
本⽂所有模板路径均为Mac下的路径,Windows⽤户也可以查看路径中的相关信息,进⽽快速定位。
模板是什么
个⼈理解:模板即为了帮助⼈们简化某些固定⽽繁琐的操作⽽制作的⼯具,⽤于快速实现这些固定⽽繁琐的操作。
模板使⽤位置
当我们在使⽤AndroidStudio进⾏开发的时候,将⿏标选中⼯程项⽬,然后右击可以在New选项下⾯看到很多AndroidStudio提供给我们的模板类别,例如:Activity、AIDL等。具体可看下图:
细⼼的你会发现在这些模板的上⾯有⼀个选项:Edit ,如下图所⽰:
点击这个选项,会进⼊⾃定义模板页⾯,其中内置的变量在页⾯下⽅都有解释,是不是很⽅便,但是它有⼀个致命的缺点:⼀次只能创建⼀个java⽂件。具体可看下图:
来自神话故事的成语有哪些
因为觉得这个很简单,所以我就不做过多阐述了,接下来我就仔细阐述⼀下,如何⼀次创建多个java⽂件,⽽且还可以选择是否包含xml⽂件。
模板如何创建(包含模板存放位置)
警告
如果直接复制相关代码的话,请注意其中的注释,可能会带来⼀些问题,如果出现问题,可以把#开头的注释去除,再尝试
如果不懂上⾯这段话的意思的话,可以先⾏跳过。
FreeMarker
AndroidStudio的模板是使⽤FreeMarker模板引擎制作的,有兴趣的可以了解⼀下。
案例&解答
案例:
由于现在的项⽬使⽤的是类MVP架构,所以基本上每个模块都需要entity、request、activity、present
er、viewmodel这五个类,⽆论是登录注册模块,还是商品详情页、⾸页、收益页⾯等模块,都⽆法摆脱这⼏个类,因此准备为这个类MVP架构制作⼀个通⽤模板。
解答:
制作好模板之后,我想说,其实很简单,只是把会变化的部分⽤${...}替换罢了,不过在这⾥我们还是⽼⽼实实的从头开始吧!
步骤
模板存放位置
⾸页我们进⼊AndroidStudio安装⽬录下的/plugins/android/lib/templates⽂件夹,这就是AndroidStudio模板⽂件的⽬录了,到这⾥你可能还有所迷惑,因为你没有发现像我刚开始所说的Activity、AIDL等模板⽂件,没关系,你再进⼊activities⽂件夹下⾯就可以看到Activity的相关模板了,进⼊other⽂件夹就可以看到AIDL的相关模板了。
模板副本
这⾥我们选择activities⽂件夹,然后你是不是觉得⼿⾜⽆措,不知道如何下⼿?其实⼀开始我也不知道怎么做,但是没关
系,AndroidStudio不是已经提供给我们这么多模板了么,为了简单起见,我们在这⾥拷贝⼀份EmptyActivity,并将其重命名为MVPActivity,放在当前⽬录下。
⽬录结构
打开⽂件夹后,我们看到以下⽬录结构:
EmptyActivity
|----l.ftl # 全局变量⽂件
|----l.ftl # 配置要引⽤的模板路径以及⽣成⽂件的路径
|----root
|----src
|----app_package
|----SimpleActivity.java.ftl # 模板⽂件
|----template_blank_activity.png # 创建模板时界⾯左边的预览图
|----l # 模板的配置信息以及要输⼊的参数
接下我们可以根据⽬录结构顺序(建议按以下顺序看),打开看⼀下,这⾥⼤致介绍⼀下:
这样的语句,显然它的意思就是我定义了⼀个全局变量hasNoActionBar,它的类型是boolean,默认值为false。
梦见生小孩
copy:复制--将from中的⽂件复制到to路径下,但并不会将ftl中得变量进⾏转换,即如果源⽂件中的类名为${activityClass},复制过后类名还是${activityClass}转换为我们需要的类名。
年组词merge:合并--将from中的⽂件合并到to路径下的⽂件中。
instantiate:和copy类似,也是将from中的⽂件复制到to路径下,但是它会将${activityClass}转换为我
们需要的类名。其实有这样⼀个过程:ftl->freemarker process -> java。
open:代码⽣成后,打开file中指定的⽂件。
SimpleActivity.java.ftl
打开SimpleActivity.java.ftl⽂件,会发现和我们创建Activity类后及其类似,只是把包名、类名、布局名等⽤${...}替换了,其实${...}中得内容都是id名,这⾥不做过多阐述,我们继续往下看。
⼀眼看去是不是和l中得Application节点中的内容结构很相似(包括Application节点)
format="5" # The template format version that this template adheres to. Should be 3
revision="5" # 可选,当你想更新模板的时候可以以整数的形式增加此模板的版本号
name="Empty Activity" # 模板显⽰的名字
minApi="7" # 可选,模板所需的最⼩API值,IDE将确保在实例化模板之前,⽬标⼯程的minSdkVersion不低于这个值
minBuildApi="14" # 可选,模板所需的最⼩编译API,值为API级别,IDE将确保在实例化模板之前,项⽬⼯程的API等级⼤于或等于这个值
description="Creates a new empty activity"> # 模板的描述信息
# 模板类型,⽤于在菜单栏File-New下显⽰,如Activity、AIDL等
# 如同我们在创建module时所显⽰的类型,如:Wear、TV等。
id="activityClass" # 唯⼀标⽰,在ftl⽂件中可以⽤${activityClass}获取参数值
name="Activity Name" # 创建模板时在⽂本框左边显⽰的该⽂本框名称
type="string" # 这个参数的类型,如:string, boolean, enum等
constraints="class|unique|nonempty" # 可选,这个参数的约束类型,可⽤|符号联合使⽤,constraints值类型⼤全请看4.5
suggest="${layoutToActivity(layoutName)}" # 可选,⾃动提⽰,⽐如输⼊layout的值可以⾃动⽣成activityClass
default="MainActivity" # 可选,参数默认值,创建模板时在⽂本框中显⽰,相当于hint
help="The name of the activity class to create" /> # 创建模板时,选中⽂本框后,在底部显⽰的关于该⽂本框的帮助信息
template_blank_activity.png # 可选,⽤于创建模板时,在左边显⽰名为template_blank_activity的预览图⽚
# 可选,将⼯程定义的全局变量包含进来
# 开始执⾏模板渲染
constraints值类型⼤全
Valid constraint types are:
nonempty — the value must not be empty
apilevel — the value should represent a numeric API level
package — the value should represent a valid Java package name
class — the value should represent a valid Java class name
activity — the value should represent a fully-qualified activity class name
精美语句layout — the value should represent a valid layout resource name
drawable — the value should represent a valid drawable resource name
string — the value should represent a valid string resource name
id — the value should represent a valid id resource name
unique — the value must be unique; this constraint only makes sense when other constraints are specified, such as layout, which would mean that the value should not represent an existing layout resource name
exists — the value must already exist; this constraint only makes sense when other constraints are s
pecified, such as layout, which would mean that the value should represent an existing layout resource name
到这⾥相信⼤家对l⽂件有了⼀定的了解了,好了,让我们来⼤⼲⼀场吧!
MVP版l
既然这⾥详细的讲解了l⽂件,我们先从l⽂件⼊⼿吧,这⾥我就不⼀个个细说了,直接上完整代码:format="2" # 可修改,此处已修改
revision="2" # 可修改,此处已修改
name="MVP Activity" # 需要修改
minApi="7" # 可修改
minBuildApi="14" # 可修改
description="Creates a new MVP activity"> # 需要修改
# 可修改,此处已修改
# ⼀般不修改
id="activityClass" # 可修改
name="Activity Name" # 可修改
type="string" # ⼀般不修改
constraints="class|unique|nonempty" # ⼀般不修改
default="TestActivity" # 可修改,此处已修改
help="The name of the activity class to create" /> # 可修改,此处未修改
id="layoutName"
name="Layout Name"
type="string"
constraints="layout|unique|nonempty"
suggest="${classToResource(activityClass)}_activity" # 可修改,此处已修改,若不明⽩可以跳过,之后会有详解default="test_activity"
help="The name of the layout to create for the activity" />
id="isLauncher"
name="Launcher Activity"
type="boolean"
default="false" # 默认⾮启动Activity
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.showjoy.shop" />
id="viewModelClass"
name="View Model Name"
type="string"
constraints="class|nonempty|unique"
default="TestViewModel"
suggest="${underscoreToCamelCase(classToResource(activityClass))}ViewModel" # 此类同布局⽂件,之后会有详解help="The name of the ViewModel to create" />
id="presenterClass"
name="Presenter Name"
type="string"
constraints="class|nonempty|unique"
default="TestPresenter"
suggest="${underscoreToCamelCase(classToResource(activityClass))}Presenter"
help="The name of the Presenter to create" />
id="requestClass"
name="Request Name"
type="string"
constraints="class|nonempty|unique"
default="TestRequest"
suggest="${underscoreToCamelCase(classToResource(activityClass))}Request"合战忍者村攻略
help="The name of the Request to create" />
id="entityClass"
name="Entity Name"
type="string"
constraints="class|nonempty|unique"
default="TestEntity"
suggest="${underscoreToCamelCase(classToResource(activityClass))}Entity"
help="The name of the Entity to create" />
# ⼀般不修改
# ⼀般不修改
(1)
suggest="${classToResource(activityClass)}_activity"
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论