如何写自定义Activity、Fragment模板

因为在项目中使用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

然后打开,看一下一个模板文件的结构
如何写自定义Activity、Fragment模板_第1张图片

把这个模板文件夹复制一份到
把两个模板文件复制到 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简单说下,其实就是为这些变量赋值,不用修改,想改也简单,参考一下就能修改了, 这应该难不倒大家。
如何写自定义Activity、Fragment模板_第2张图片

这里的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 {
    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

你可能感兴趣的:(Android开发)