在Android Studio中编写一个自己的模板
今日科技快讯
4月21日晚间,上海一辆特斯拉在地库中突然自燃。对此特斯拉表示,在得知事故后,昨晚公司第一时间派出团队赶往现场,目前正在积极联络相关部门并配合核实情况。
作者简介
大家早上好,本篇文章来自 埋心。的投稿,和大家分享了如何编写一个Android Studio 模板进行以提高开发的效率,相信会对大家有所帮助!同时也感谢作者贡献的精彩文章。
埋心。的博客地址:
https://me.csdn.net/qq_31910313
效果
学习LoginActivity模板
首先我们打开studio安装目录找到系统原生模板,D:\Program Files\Android\studio\plugins\android\lib\templates\activities 这个是我的安装目录,在这里我们可以看到很多原生模板代码可以参考及借鉴,下面我们举例将LoginActivity用sublimeText打开,如果本地没有请自行下载。
在这里我们可以看到root文件下存放的是res和src两个文件夹对应的就是我们在开发时的目录这里不过多解释。
global:里面存放的是全局变量
recipe:这个文件会去获取template文件的id然后去创建相对应模板
template:给使用模板用户所看到的页面
自己编写一个简单mvp模板
首先我们去创建一个模板名称为mvp,接着打开template文件我们设置下name和description。
<template
format="5"
revision="1"
name="Mvp"
description="第一个插件模板的诞生之路1">
<category value="Activity"/>
<formfactor value="Mobile"/>
</template>
这时在通过studio工具查看模板就会发现刚才自定义模板已经生成了可以在studio->new->Activity中查看到。
下面我们创建MvpLoginActivity的模板,打开template.xml
<parameter
id="activityClass"
name="Activity Name"
type="string"
constraints="class|nonempty"
help="hexl 测试模板 Activity"/>
打开recipe.xml.ftl文件。
<#-- 创建一个实例
from:从指定路径下引入该模板文件,相关模板代码都将在该文件中创建
to:输出到指定的目录
mvpPath、 相当于变量,该变量在global文件中进行定义
-->
<instantiate from="root\src\app_package\LoginActivity.java.ftl"
to="${mvpPath}ui/activity/${activityClass}Activity.java"/>
<#-- 打开创建的文件 -->
<open file="${mvpPath}ui/activity/${activityClass}Activity.java"/>
在这里我们看到有两个变量分别是mvpPath和activityClass两个变量,mvpPath在globals.xml.ftl定义。
<global id="mvpPath" type="string" value="${escapeXmlAttribute(srcOut)}/mvp/"/>
activityClass就是引用template.xml定义的activity ID。Presenter 和 Model 都是一样的代码可以创建出来,这里不再展示,文章结束会给出源码。
类名与Layout联动
Activity和Layout名称联动
我们要实现输入类名时布局名称也随之联动,主要看下suggest这个参数
<!-- 创建布局 -->
<parameter
id="layoutActivityClass"
name="Activity Layout"
constraints="layout|nonempty"
default="activity_main"
suggest="${activityToLayout(activityClass)}"
help="hexl 测试模板 Layout"/>
Fragment和Layout名称联动
<!-- 创建Fragment -->
<parameter
id="fragmentClass"
name="Fragment Name"
type="string"
constraints="class|nonempty"
help="hexl 测试模板 Fragment"/>
<!-- 创建布局
Fragment 布局名称联动与Activity 不一样,需要特别注意
-->
<parameter
id="layoutFragmentClass"
name="Fragment Layout"
constraints="layout|nonempty"
default="fragment_main"
suggest="fragment_${classToResource(fragmentClass)}"
help="hexl 测试模板 Layout"/>
Adapter和itemLayout名称联动
<parameter
id="adapterClass"
name="Adapter Name"
type="string"
constraints="class|nonempty"
help="Adapter 将被输出到 package.adapter 下"/>
<!--
adapter item 名称联动与fragment和activity都不一样
规范是 item_$小写adapterClass
-->
<parameter
id="adapterLayoutClass"
name="Adapter Layout Name"
type="string"
suggest="item_${extractLetters(commonName?lower_case)}"
constraints="class|nonempty"
visibility="needAdapterLayout"
help="AdapterLayout 布局文件将被输出到 res/layouts/items/ 下"/>
这里用到了commonName,所以我们要在template定义出来。
<!-- 公共名称 -->
<parameter
id="commonName"
name="Common Name"
type="string"
constraints="nonempty"
help="公共名称,作为所有页面的前缀"
default="Hexl"/>
<instantiate from="root/src/app_package/LoginAdapter.java.ftl"
to="${mvpPath}/adapter/${commonName}Adapter.java"/>
<instantiate from="root/res/layout/simple.xml.ftl"
to="${escapeXmlAttribute(resOut)}/layout/${adapterLayoutClass}.xml"/>
这里引入了一个simple.xml.ftl文件其实很简单,只要在root->res->layout目录下进行声明就ok了。
生成不同级别目录
例如我们将adapter放到与mvp同一级别目录下,而不是在mvp目录下我们该如何进行骚操作呢?
首先我们在global.xml.ftl文件中定义个变量。
<global id="adapterPath" type="string" value="${escapeXmlAttribute(srcOut)}/adapter/"/>
然后修改recipe.xml.ftl文件输出的目录。
<instantiate from="root/src/app_package/LoginAdapter.java.ftl"
to="${adapterPath}/${commonName}Adapter.java"/>
下载源码的地址:
https://github.com/HexlDL/Mvp
推荐阅读:
欢迎关注我的公众号,学习技术或投稿
长按上图,识别图中二维码即可关注