因为在项目中使用MVP模式,所以每次新建一个Activity、Fragment的时候都要写一大堆的类,接口和Presenter。如果加上Dagger2,那酸爽,简直了。
上篇有提到MVP+Rx的结构,这篇博客就基于上篇博客来自定义一个模板文件, 如果不想自己重头开始写的, 可以把我发在github上的模板稍微改改就可以用了,需要掌握一些基本规则。
先讲讲如何修改一下
首先可以到我的github上面去下载一个模板
https://github.com/sunflowerseat/MVPDemo/tree/master/MVPActivityTemplate/MVPActivity
https://github.com/sunflowerseat/MVPDemo/tree/master/MVPFragmentTemplate/MVPFragment
把这个模板文件夹复制一份到
把两个模板文件复制到 AS根目录\plugins\android\lib\templates\activities 下
如果需要立刻看一下这个模板的效果,建议先把我发在github上的demo克隆下来。https://github.com/sunflowerseat/MVPDemo
新建一个MVPActivity、MVPFragment就能看到效果了。
注意: 假设程序包名为 a.b.c 不要在a.b.c这个包下面新建Activity、Fragment. 除了这个包,其他的均可以
简单说一下这几个文件的作用。
root是用于存放要生成的文件的模板的,比如上例,我新建一个TestActivity的时候,需要同时生成:
TestActivity.java
activity_test.xml
ITest.java
TestPresenter.java
四个文件,这已经算很少的了,多几个文件也一样操作。
把需要生成的文件,复制到root目录下,layout文件放到root/res/layout下面。java文件放到root/src/app_package下面。
globals.xml.ftl 是用于存放全局变量的。如果没有特殊要求,不需要动,如果要改,可以参考系统其它Activity模板中的修改。
recipe.xml.ftl 是用于配置,具体要生成哪些文件, 要打开哪几个文件的。
<instantiate from="root/src/app_package/SampleFragment.java.ftl"
to="${escapeXmlAttribute(srcOut)}/${fragmentName}.java" />
<instantiate from="root/res/layout/fragment_sample.xml.ftl"
to="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
<instantiate from="root/src/app_package/INone.java.ftl"
to="${escapeXmlAttribute(manifestOut)}/java/${slashedPackageName(applicationPackage)}/act_interface/${modular}/I${pageName}.java" />
<instantiate from="root/src/app_package/NonePresenter.java.ftl"
to="${escapeXmlAttribute(manifestOut)}/java/${slashedPackageName(applicationPackage)}/act_presenter/${modular}/${pageName}Presenter.java" />
<open file="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml"/>
<open file="${escapeXmlAttribute(srcOut)}/${fragmentName}.java" />
template.xml简单说下,其实就是为这些变量赋值,不用修改,想改也简单,参考一下就能修改了, 这应该难不倒大家。
这里的pageName 对应的 ${pageName}
FragmentName 对应的${fragmentName}
Fragment Layout Name 对应的${layoutName}
Modular Name 对应的${modular}
接下来我们需要完成最后一步。
把之前复制到root目录下的文件后缀名修改成ftl。
然后全部打开。
博客简单说一下如何修改一个文件变成Template。其他的同理。
先看看我们的TestPresenter
package com.fancy.mvpdemo.act_presenter.test;
import com.fancy.mvpdemo.act_interface.test.ITest;
import com.fancy.mvpdemo.act_presenter.base.BasePresenter;
/**
* create by sunflowerseat.
*/
public class TestPresenter extends BasePresenter<ITest> {
private ITest iview;
public TestPresenter(ITest main) {
this.attachView(main);
iview = getView();
}
}
这个文件需要生成在com.fancy.mvpdemo.act_presenter.test目录下, 把recipe.xml.ftl里面的生成路径修改一下即可。
以上代码中“com.fancy.mvpdemo”对应的是程序的包名。 改成 applicationPackage即可。actpresenter这个是我生成的目录,可以按需修改,改成presenter或者其他你需要的。test对应的是模块名称修改成 {modular}即可。
其他修改同理。修改后的模板文件为:
package ${applicationPackage}.act_presenter.${modular};
import ${applicationPackage}.act_interface.${modular}.I${pageName};
import ${applicationPackage}.act_presenter.base.BasePresenter;
/**
* Created by sunflowerseat.
*/
public class ${pageName}Presenter extends BasePresenter {
private I${pageName} iview;
public ${pageName}Presenter(I${pageName} main) {
this.attachView(main);
iview = getView();
}
}
这种简单的改动,相信大家都能完成, 最后就是把写好的模板文件复制到 AS根目录\plugins\android\lib\templates\activities 下,重启studio即可使用。
注意: 假设程序包名为 a.b.c 不要在a.b.c这个包下面新建Activity、Fragment. 除了这个包,其他的均可以。
如果写好的模板文件报错,一般都会有提示是什么错误,以及错误的位置, 仔细检查模板文件。然后修改就可以了。
我也把模板Acitivity的代码发到了github上,供大家参考学习,共同进步。
https://github.com/sunflowerseat/MVPDemo/tree/master/MVPActivityTemplate/MVPActivity
https://github.com/sunflowerseat/MVPDemo/tree/master/MVPFragmentTemplate/MVPFragment
最后再简单理一下,如何简单修改一下示例模板文件,变成适合自己的MVP模板文件。
1、把上面链接中的文件夹从github上面下载下来。
2、把需要生成的文件放到root目录下的对应目录中,并修改增加后缀.ftl
3、global.xml.ftl不要去动
4、recipe.xml.ftl简单修改成自己的模板文件名称和文件放置的目录
以及 生成的位置,注意recipe.xml.ftl是可以使用template中的变量的。
5、template.xml也不用修改。
6、参照文中修改TestFragment的例子,修改所有需要生成的模板文件。
最后贴一下这个Android模板中内置的一些变量对应的值和我在探索模板的过程中记录笔记。我们在模板文件中不仅可以使用自己定义的变量,也可以使用内置的一些变量。
${relativePackage} 相对包名,你在那个包建的文件,这个包名则为那个包
${slashedPackageName(projectPackage)} 把 .cc.aa 这种形式的包名替换成 /cc/aa
${escapeXmlAttribute(resOut)} res的绝对路径
${escapeXmlAttribute(srcOut)} src的绝对路径
${escapeXmlAttribute(manifestOut)} manifest的绝对路径
${activityToLayout(activityClass)} 根据activityClass生成activityLayout的名字
${applicationPackage} 应用程序包名,即applicationId
简单说一下template.xml中的parameter每个变量的作用。
"activityLayoutName"
name="Layout Name"
type="string"
constraints="layout|unique|nonempty"
suggest="${activityToLayout(activityClass)}"
default="activity_main"
help="The name of the layout to create for the activity" />
id 这个不多说,变量名称
name 显示在模板上,需要程序员填写的变量值
type 变量的类型 string则显示文本框 boolean则显示复选框
constraints 约束 layout,必须符合layout的命名,unique唯一的, nonempty不能为空
suggest 提示
default 默认值
help 帮助, 告诉用户这个变量相对于模板的作用, 不重要
对本文内容有任何疑问欢迎加群讨论:283272067