如何写自定义Activity、Fragment模板

来源:互联网 发布:把mac里的文件拷到u盘 编辑:程序博客网 时间:2024/05/21 23:22

因为在项目中使用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 是用于配置,具体要生成哪些文件, 要打开哪几个文件的。

    <!--假如functionName 填写的是 Test         模块名称也就是 modular 填写的是home        那么 fragmentName = TestFragment        layoutName = fragment_test    -->    <!--生成一个TestFragment在新建Fragment的位置(包)中  使用模板SampleFragment-->    <instantiate from="root/src/app_package/SampleFragment.java.ftl"        to="${escapeXmlAttribute(srcOut)}/${fragmentName}.java" />    <!--生成一个fragment_test在系统res/layout/目录下 使用模板fragment_sample---->    <instantiate from="root/res/layout/fragment_sample.xml.ftl"        to="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />    <!--生成一个ITest在        applicationPackage 是你的应用包名 如:a.b.c          ${slashedPackageName(applicationPackage)}  则为a/b/c        manifest的同级目录下的/java文件夹/a/b/c/        之后的就不说了自己填写自己想要放置的位置即可    -->    <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" />    <!-- 打开layout文件和Fragment文件 -->    <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”对应的是程序的包名。 改成 applicationPackageactpresenterpresentertest{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<I${pageName}> {    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每个变量的作用。

<parameter    id="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

0 0
原创粉丝点击