Android Template使用
由于在项目中使用了Mvp+Dagger的模式进行开发,在实际使用中针对一个页面需要建六七个页面,而这里面很多代码是重复性的,所以考虑要使用Template来提高工作效率
参考文章:
- http://blog.csdn.net/lmj623565791/article/details/51635533
- https://developer.android.com/studio/projects/templates.html
具体的使用方法在上面的文章中已经有了讲解,我这里就记录一下自己的使用经过。
AndroidStudio提供的有多种模版,位置在
{AndroidStudio安装目录}/plugins/android/lib/templates/
对应到我的机器上是:
/Users/xxx/Applications/Android Studio.app/Contents/plugins/android/lib/templates/activities/
这个目录下有As自己预设好的各种模版,我们在 new-> activity->BasicActivity操作的时候使用的就是这里的预设模版。
我们需要做的是把我们自己写好的模版(Mvp Activity)放到这个目录的/activitys目录下,重启AndroidStudio。就可以在new->activity->Mvp Activity中使用我们自己写的模版了。
通过对预设模版的分析,发现目录结构如下:
- root/
- root/res(该目录下是放置资源文件的)
- root/src(该目录下是放置源代码的)
- globals.xml.ftl(该文件配置全局变量)
- recipe.xml.ftl(该文件负责具体的文件merge 命名 打开文件等操作)
- template.xml(该文件定义新建输入项)
root/res root/src
root/res以及root/src目录下放置我们的资源文件以及源代码文件,对应我们开发时项目目录结构下的res目录和src目录,res里面有values layout等文件夹,资源文件可以通过recipe里的merge命令合并到我们项目中的res目录下。源代码文件通过instantiate命令重命名并迁移到对应目录下。这里的所有文件后缀名都是ftl。
#TempMvpActivity.java.ftl
package ${packageName};
/**
* @author lsp
* @created 17/3/3 16:38
*/
public class ${activityClass}Activity extends Activity{
}
打开我们的一个activity文件,其中代码部分跟我们自己写的activity是一样的,只是需要替换掉的部分用变量替换掉就可以在通过模版生成代码时候自动读取变量生成对应的文件以及代码了。
globals.xml.ftl
globals文件是用来定义全局变量以及引入系统预设全局变量的
#globals.xml.ftl
<?xml version="1.0"?>
<globals>
<global id="hasNoActionBar" type="boolean" value="false" />
<#include "../common/common_globals.xml.ftl" />
</globals>
我们也可以自己在这里定义我们需要的变量,然后通过$(hasNoActionBar)这样的方式来进行调用。
include的通用目录在
/Applications/Android Studio.app/Contents/plugins/android/lib/templates/activities/common
recipe.xml.ftl
recipe文件是用来实际操作生成模版的,他包含了一系列操作标签:
#recipe.xml.ftl
<?xml version="1.0"?>
<recipe>
<#include "recipe_manifest.xml.ftl" />
//把string合并到项目中的strings中
<merge from ="root/res/values/strings.xml.ftl"
to="${escapeXmlAttribute(resOut)}/values/strings.xml"/>
//合并代码
<instantiate from = "root/src/TempMvpActivity.java.ftl"
to ="${escapeXmlAttribute(srcOut)}/${activityClass}Activity.java"/>
<instantiate from = "root/src/TempMvpComponent.java.ftl"
to ="${escapeXmlAttribute(srcOut)}/${activityClass}Component.java"/>
<instantiate from = "root/src/TempMvpFragment.java.ftl"
to ="${escapeXmlAttribute(srcOut)}/${activityClass}Fragment.java"/>
<instantiate from = "root/src/TempMvpModule.java.ftl"
to ="${escapeXmlAttribute(srcOut)}/${activityClass}Module.java"/>
<instantiate from = "root/src/TempMvpPresenter.java.ftl"
to ="${escapeXmlAttribute(srcOut)}/${activityClass}Presenter.java"/>
<instantiate from = "root/src/TempMvpView.java.ftl"
to ="${escapeXmlAttribute(srcOut)}/${activityClass}View.java"/>
<instantiate from="root/res/layout/activity_mvp.xml.ftl"
to="${escapeXmlAttribute(resOut)}/layout/${activityLayoutName}.xml" />
<instantiate from="root/res/layout/fragment_mvp.xml.ftl"
to="${escapeXmlAttribute(resOut)}/layout/${fragmentLayoutName}.xml" />
//打开指定文件
<open file="${escapeXmlAttribute(srcOut)}/${activityClass}Activity.java" />
</recipe>
上面这个是我生成模版用的,里面包含的标签如下:
- <#include> 是引入其他的配置文件的,我这里用到了AndroidManifest的合并,所以我把合并的文件引入进来。当然AndroidManifest的合并操作直接在该文件里面写也是没问题的。
- copy
<copy from="root/res/drawable-hdpi"
to="${escapeXmlAttribute(resOut)}/drawable-hdpi" />
这个操作符可以把我们模版里的资源文件复制到对应的项目资源目录下
- merge
<merge from ="root/res/values/strings.xml.ftl"
to="${escapeXmlAttribute(resOut)}/values/strings.xml"/>
我们可以通过这个操作符对资源文件进行合并,比如strings,AndroidManifest文件等。
- instantiate
<instantiate from = "root/src/TempMvpPresenter.java.ftl"
to ="${escapeXmlAttribute(srcOut)}/${activityClass}Presenter.java"/>
这个操作符很常用到,是用来把我们的ftl文件进行一系列处理(变量替换,文件名重命名,去掉ftl后缀)并copy到指定的位置。这个是生成我们模版文件以及代码的主要操作。(freemarker)
- open
<open file="${escapeXmlAttribute(srcOut)}/${activityClass}Activity.java" />
在代码生成后,打开指定的文件
template.xml
这个文件是用来定义新建时候的输入项的。
<parameter
id="activityClass"
name="Activity Name"
type="string"
constraints="class|unique|nonempty"
suggest="${layoutToActivity(activityLayoutName)}"
default="MvpActivity"
help="The name of the activity class to create"/>
- id :通过该标识,获取输入的内容$(activityClass)
- name:输入框左边的提示语
- type : 输入值类型 可以为string或者boolean
- constraints:填写值的约束,比如不能为空,是否唯一
- suggest:建议值
- default:默认值
- help:输入框获取焦点时底部显示的提示语
这个文件里定义的每一项都会在新建时候展示出来让使用者输入或者选择。然后对应的变量会在生成模版时候使用。
freemarker
在我们编写模版时候使用到的freemarker,可以通过以下文章进行了解
坑点
总体来说模版的编写还是很简单的。想要的功能大多可以在预设模版中找到。把需要使用的功能从预设模版中copy过来修改就可以了。
- 在合并AndroidManifest的时候一直提示合并冲突,AndroidManifest合并到项目中就在</manifest>标签外了。最后查出来是我编写模版Manifest文件时少了一个>符号。所以对于没有lint检查的ftl文件写的时候一定要注意好仔细一点,否则会导致意想不到的问题。
- 由于需要生成的类有点多,统一命名的时候需要用freemarker来对输入的字符串进行处理,如果用法不对就会导致创建时候androidstudio卡死。