这个教程是自己在实习工作中总结出来一些可以避免重复性开发的技巧,程序员很懒的,敲过一遍的东西说什么都不愿再去敲一遍,这个系列就是希望自己能把时间更多的用于自己的技能提升上面,而不是而不是做一个重复劳动的机器人。
android studio 创建一个Activity的时候会弹出一个对话框,让你选择一个类型的Activity:
谷歌给我们提供了11个默认的模板类型,一般我们使用的都是Basic Activity 然后 自己添加数据:
很多,很爽是不是。本来很多重复性的工作就可以这么点点点就改改改就可以了,这对我们平时的工作效率的提升是个很大的帮助。(想:老大那一天给个需求,我5分钟就写完了,接下来的时间岂不是可以自己偷偷懒)
其实这个东西就是一个帮我们减轻工作负担,提升工作效率的工具
模板文件在android studio 的安装目录下面:E:\工具软件\android studio\android\plugins\android\lib\templates
这个文件夹下面有4个文件夹:
我们的activity的模板插件就在activities 文件夹下面,gradle-projects 是存放模块模板插件的,orther 是存放其他的一些模板插件的例如AIDL的模板插件
在进入activities 文件夹下面:
可以看到很多文件夹一个文件夹就是对应一个插件,其中common文件夹下面是一些公共的插件文件:
谷歌给了我们一张图说是可以很清楚的看出这个插件的结构和流程:
接下来的话现在可以不用看懂:可以选择看完和做完这个插件后再回来看这张图:
首先他说他是基于一种叫FreeMarker 的引擎(其实很简单我觉得就是一种规范而已。)写的插件,里面有UI界面(是由template.xml生成的),recipe.xml.ftl 这个文件是用于合并和生成Java文件的,root资源文件夹,这个文件夹里面是一些我们的模板文件,我们一般是自己做了一个东西后觉得那些是下次可以复用的文件直接文件粘贴到这个文件夹下面然后进行一些操作
首先我们打开一个我的MVP Activity 模板文件的文件夹(这个简单的MVP Activity模板后文有下载链接):
可以看到有3个文件一张图片,和一个root文件夹,
globals.xml 文件里面定义了一些全局变量。有那些等会再说
首先看Template.xml 这个文件:这个文件在上面的那张谷歌给的图上面是UI部分的图:
他在逻辑上分为3个部分:
基本信息部分:申明这个插件是什么插件,用于作什么的: format="5"
revision="5"
name="MVP 活动" //模板名字 会在选择模板的时候体现出来
minApi="9"
minBuildApi="14"
description="创建一个简单的MVP活动" //模板帮助会在转中后展现>
选择框的内容:这个部分是说明自定义的模板UI上的一个能操作控件的内容:
一个能操作的控件就是一个 parameter 标签包含的内容:先是一个简单的activity
"activityClass" //这个输入框的id,可以通过这个ID 获得这个控件的状态,玩Android的人都听熟系的。
name="Activity Name" 这个控件的lable
type="string" 这个控件是什么类型的:String ,boolean
constraints="class|unique|nonempty" 约束值,多常见的有class,代表类名;layout代表布局名;package 代表包路径; unique则是不能与现有的重复;nonemptye表示不能为空。
suggest="${layoutToActivity(layoutName)}" 建议值 ,这里用了一个
layoutToActivity的方法,起到联动的作用这个方法的方法体在
default="MainActivity"默认值
help="The name of the activity class to create" 注释。一般选中那个控件后会在对话框Previous 这个按钮边上显示(最后一行Finish按钮的边上的边上3个边上)/>
3.联系内容:这个部分的内容不会显示在对话框中,但确实联系整个插件文件的核心:
<thumbs>
<thumb>template_blank_activity.pngthumb> 这个地方导入了根目录的图片,作为对话框的显示图片。
thumbs>
<globals file="globals.xml.ftl" /> 导入globals.xml.ftl 文件(全局变量)
<execute file="recipe.xml.ftl" /> 导入recipe.xml.ftl 文件
有人问不太对啊,怎么就填充资源文件了?recipe.xml.ftl 文件都没有分析,是的recipe 这个文件是一个用于转化模板文件成我们代码文件的配置文件,所以我们要先写模板文件,有了模板文件这个根源才能转化出代码文件。
先看root文件的结构:
很熟系吧,这个res放资源,src放代码
首先 我们看一个MVP的Activity有那些文件:一个Activity文件,一个Present文件一个布局文件布局文件一般直接在后面添加.fit然后添加到res/layout文件夹下面:
Activity文件分析这个代码文件怎么转化成ftl文件:
package net.ed58.dlm.clients; //package ${packageName}; packageName 在template.xml 文件里面有这个是文件宝明
import net.ed58.dlm.clients.base.BaseCoreMVPActivity; //直接复制
import net.ed58.dlm.clients.MainssActivityPersent; //import ${packageName}.${presentName}; 基本就是靠拼接和占位符
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
//需要的转化的都是${}来应用id从而获得值
public class MainssActivity/*这个也是要转化拼接:${activityClass}*/ extends BaseCoreMVPActivity implements MainssActivityPersent.Ui {
@Override
public int getLayoutId() {
return R.layout.activity_mainss;
}
@Override
public void onPointerCaptureChanged(boolean hasCapture) {
}
@Override
protected MainssActivityPersent createPresenter() {
return null;
}
@Override
protected MainssActivityPersent.Ui getUi() {
return this;
}
}
由这个想法:拼接出SimplePersent 文件
package net.ed58.dlm.clients.me;
import net.ed58.dlm.clients.base.BasePresenter;
import net.ed58.dlm.clients.base.BaseUI;
/**
* Created by Administrator on 2017/11/27/027.
*/
public class ${presentName} extends BasePresenter<${presentName}.Ui> {
public interface Ui extends BaseUI{}
}
放入\src\app_package文件夹下面
<#import "root://activities/common/kotlin_macros.ftl" as kt>
<recipe>
<#include "../common/recipe_manifest.xml.ftl" />
<@kt.addAllKotlinDependencies />
<#if generateKotlin>
<instantiate from="root/src/app_package/SimpleActivity.kt.ftl"
to="${escapeXmlAttribute(srcOut)}/${activityClass}.kt" />
<instantiate from="root/src/app_package/SimplePresent.kt.ftl"
to="${escapeXmlAttribute(srcOut)}/${presentName}.kt" />
<open file="${escapeXmlAttribute(srcOut)}/${activityClass}.kt" />
<#else>
<instantiate from="root/src/app_package/SimpleActivity.java.ftl"
to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
<instantiate from="root/src/app_package/SimplePresent.java.ftl"
to="${escapeXmlAttribute(srcOut)}/${presentName}.java" />
<open file="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
#if>
<instantiate from="root/res/layout/activity_main.xml.ftl"
to="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
recipe>
首先看几个语法:
1.<#if generateKotlin> <#if 资源id> if语句更具资源ID获得boolean
2.
"root/src/app_package/SimpleActivity.kt.ftl"
to="${escapeXmlAttribute(srcOut)}/${activityClass}.kt" />
instantiate 语句,等于转化,from 后接文件地址(相对目录)${escapeXmlAttribute(srcOut)}这个等价与包名地址 srcOut 也可以转化成resOut 隐射到资源文件 ,然后拼接文件名字
3。open 默认打开的文件
代码下载:http://download.csdn.net/download/qq_24858963/10135249