一、简介
AndroidStudio中的LiveTemplates功能从文本上来看就是模板的意思,这个模板指的是编写代码时给开发人员提供方便快捷的编写模板。可以让开发者只需要输入几个固定的文本就能快速的生成出一套代码来供开发者使用。
LiveTemplates在Settings(设置)的Editor功能下

AndroidStudio本身提供了一套用来快速生成代码的默认模板,此模板不只是提供了Android系统特有的代码方式,还包含C/C++ 、html/xml 、 java 及在AndroidStudio3.0后新增加的kotlin代码模板。
二、如何编写

在上图中,选中const这个条目,就会在下面显示出此模板的具体信息,也就可以进行编辑了。如果是想要增加或者删除模板条目,可以在右侧带有加减号的位置进行操作。
在下面编辑的部分中,Abbreviation对应的输入框是填写的条目的名字,同时在代码中输入此文本,按回车键就会将模板中的代码给生成出来了。
Description对应的是模板的描述信息,在写代码时,会有提示。
Template text就是输入模板代码的位置,此处输入代码和真是编写代码是差不多的。需要注意的地方是,如果你需要引用使用时的上下文内容,就需要进行声明变量了。而在模板中的变量声明方式是用$符号进行包裹的,和图中示例中的类似。$name$ 和 $value$ 就是两个变量。
这两个变量可以赋予不同的含义,赋予含义的位置在右侧的Edit variables上。点击此处会出现下图中的内容:

1、Name列表指的是要编辑的变量的键,如果不编辑的话,在代码中使用的时候,鼠标光标会自动放到对应位置进行等待编辑,就需要手动进行赋值了。
2、Expression是变量的逻辑方式,点击之后,会有列表进行提醒,列表中提供的逻辑方式很多,包括ClassName(编写代码时当前文件的类名)等。类似图中的groovyScript()则是函数实现了,具体的函数内容就在括号中进行编辑就可,用双引号包裹。此图中的函数是:new Random().nextInt(1000) ,随机一个1000内的正整数。
3、Default value列表,顾名思义就是变量值的缺省。
4、Skip if defined,选中的话,意味着跳过编辑,也就是说如果这个值是已经用函数(Expression)生成出来了,不再需要开发者再修改的话,此处选中。如果这个值没有被赋值,意味着开发者在使用时需要进行再次编写,此处不要选中。
5、相同变量的值是一样的,未赋予含义的变量的值,会在开发者写代码时,同步修改。
三、自己编写
展示一条我个人编写的模板,此模板的作用是快速生成Handler内部类,同时解决内存泄露的情况:
private static class MyHandler extends android.os.Handler{
private final java.lang.ref.WeakReference<$ClassName$> reference;
public MyHandler(android.os.Looper looper ,$ClassName$ $className$){
super(looper);
reference = new java.lang.ref.WeakReference<$ClassName$>($className$);
}
@Override
public void handleMessage(android.os.Message msg) {
super.handleMessage(msg);
$ClassName$ $className$ = reference.get();
switch (msg.what) {
}
}
};
上文中,需要导包的类,最好将全路径写上去,这样的好处是在实际使用模板时,不需要再次导包,而AS会自动把包导入完毕。
LiveTemplates编写的内容会以xml文件的形式,写入到AndroidStudio的安装目录中,我的路径是:C:\Users\1.AndroidStudio3.0\config\templates
如果懒得编写,可以将下文的xml文本粘贴到此目录下的Android.xml文件中。
<template name="mHandler" value="private static class MyHandler extends android.os.Handler{ private final java.lang.ref.WeakReference<$ClassName$> reference; public MyHandler(android.os.Looper looper ,$ClassName$ $className$){ super(looper); reference = new java.lang.ref.WeakReference<$ClassName$>($className$); } @Override public void handleMessage(android.os.Message msg) { super.handleMessage(msg); $ClassName$ $className$ = reference.get(); switch (msg.what) { } } };" description="handler" toReformat="false" toShortenFQNames="true">
<variable name="ClassName" expression="className()" defaultValue="" alwaysStopAt="false" />
<variable name="className" expression="" defaultValue="" alwaysStopAt="true" />
<context>
<option name="JAVA_CODE" value="true" />
</context>
</template>