Android Template使用

Android Template使用

由于在项目中使用了Mvp+Dagger的模式进行开发,在实际使用中针对一个页面需要建六七个页面,而这里面很多代码是重复性的,所以考虑要使用Template来提高工作效率


参考文章:

具体的使用方法在上面的文章中已经有了讲解,我这里就记录一下自己的使用经过。

AndroidStudio提供的有多种模版,位置在

{AndroidStudio安装目录}/plugins/android/lib/templates/

对应到我的机器上是:

/Users/xxx/Applications/Android Studio.app/Contents/plugins/android/lib/templates/activities/

这个目录下有As自己预设好的各种模版,我们在 new-> activity->BasicActivity操作的时候使用的就是这里的预设模版。

我们需要做的是把我们自己写好的模版(Mvp Activity)放到这个目录的/activitys目录下,重启AndroidStudio。就可以在new->activity->Mvp Activity中使用我们自己写的模版了。

template1.jpeg

通过对预设模版的分析,发现目录结构如下:

  • root/
  • root/res(该目录下是放置资源文件的)
  • root/src(该目录下是放置源代码的)
  • globals.xml.ftl(该文件配置全局变量)
  • recipe.xml.ftl(该文件负责具体的文件merge 命名 打开文件等操作)
  • template.xml(该文件定义新建输入项)
template2.jpeg

root/res root/src

root/res以及root/src目录下放置我们的资源文件以及源代码文件,对应我们开发时项目目录结构下的res目录和src目录,res里面有values layout等文件夹,资源文件可以通过recipe里的merge命令合并到我们项目中的res目录下。源代码文件通过instantiate命令重命名并迁移到对应目录下。这里的所有文件后缀名都是ftl。

#TempMvpActivity.java.ftl
package ${packageName};

/**
 * @author lsp
 * @created 17/3/3 16:38
 */
public class ${activityClass}Activity extends Activity{
  
}

打开我们的一个activity文件,其中代码部分跟我们自己写的activity是一样的,只是需要替换掉的部分用变量替换掉就可以在通过模版生成代码时候自动读取变量生成对应的文件以及代码了。

globals.xml.ftl

globals文件是用来定义全局变量以及引入系统预设全局变量的

#globals.xml.ftl
<?xml version="1.0"?>
<globals>
    <global id="hasNoActionBar" type="boolean" value="false" />
    <#include "../common/common_globals.xml.ftl" />
</globals>

我们也可以自己在这里定义我们需要的变量,然后通过$(hasNoActionBar)这样的方式来进行调用。
include的通用目录在

/Applications/Android Studio.app/Contents/plugins/android/lib/templates/activities/common

recipe.xml.ftl

recipe文件是用来实际操作生成模版的,他包含了一系列操作标签:

#recipe.xml.ftl
<?xml version="1.0"?>
<recipe>
    <#include "recipe_manifest.xml.ftl" />

    //把string合并到项目中的strings中
        <merge from ="root/res/values/strings.xml.ftl"
                to="${escapeXmlAttribute(resOut)}/values/strings.xml"/>

    //合并代码
    <instantiate from = "root/src/TempMvpActivity.java.ftl"
                 to ="${escapeXmlAttribute(srcOut)}/${activityClass}Activity.java"/>

    <instantiate from = "root/src/TempMvpComponent.java.ftl"
                     to ="${escapeXmlAttribute(srcOut)}/${activityClass}Component.java"/>

    <instantiate from = "root/src/TempMvpFragment.java.ftl"
                     to ="${escapeXmlAttribute(srcOut)}/${activityClass}Fragment.java"/>

    <instantiate from = "root/src/TempMvpModule.java.ftl"
                         to ="${escapeXmlAttribute(srcOut)}/${activityClass}Module.java"/>

    <instantiate from = "root/src/TempMvpPresenter.java.ftl"
                         to ="${escapeXmlAttribute(srcOut)}/${activityClass}Presenter.java"/>

    <instantiate from = "root/src/TempMvpView.java.ftl"
                         to ="${escapeXmlAttribute(srcOut)}/${activityClass}View.java"/>


    <instantiate from="root/res/layout/activity_mvp.xml.ftl"
            to="${escapeXmlAttribute(resOut)}/layout/${activityLayoutName}.xml" />

    <instantiate from="root/res/layout/fragment_mvp.xml.ftl"
                to="${escapeXmlAttribute(resOut)}/layout/${fragmentLayoutName}.xml" />

    //打开指定文件
    <open file="${escapeXmlAttribute(srcOut)}/${activityClass}Activity.java" />

</recipe>

上面这个是我生成模版用的,里面包含的标签如下:

  • <#include> 是引入其他的配置文件的,我这里用到了AndroidManifest的合并,所以我把合并的文件引入进来。当然AndroidManifest的合并操作直接在该文件里面写也是没问题的。
  • copy
<copy from="root/res/drawable-hdpi"
to="${escapeXmlAttribute(resOut)}/drawable-hdpi" />

这个操作符可以把我们模版里的资源文件复制到对应的项目资源目录下

  • merge
<merge from ="root/res/values/strings.xml.ftl"
to="${escapeXmlAttribute(resOut)}/values/strings.xml"/>

我们可以通过这个操作符对资源文件进行合并,比如strings,AndroidManifest文件等。

  • instantiate
<instantiate from = "root/src/TempMvpPresenter.java.ftl"
 to ="${escapeXmlAttribute(srcOut)}/${activityClass}Presenter.java"/>

这个操作符很常用到,是用来把我们的ftl文件进行一系列处理(变量替换,文件名重命名,去掉ftl后缀)并copy到指定的位置。这个是生成我们模版文件以及代码的主要操作。(freemarker)

  • open
<open file="${escapeXmlAttribute(srcOut)}/${activityClass}Activity.java" />

在代码生成后,打开指定的文件

template.xml

这个文件是用来定义新建时候的输入项的。

template3.jpeg
<parameter
      id="activityClass"
      name="Activity Name"
      type="string"
      constraints="class|unique|nonempty"
      suggest="${layoutToActivity(activityLayoutName)}"
      default="MvpActivity"
      help="The name of the activity class to create"/>
  • id :通过该标识,获取输入的内容$(activityClass)
  • name:输入框左边的提示语
  • type : 输入值类型 可以为string或者boolean
  • constraints:填写值的约束,比如不能为空,是否唯一
  • suggest:建议值
  • default:默认值
  • help:输入框获取焦点时底部显示的提示语

这个文件里定义的每一项都会在新建时候展示出来让使用者输入或者选择。然后对应的变量会在生成模版时候使用。

freemarker

在我们编写模版时候使用到的freemarker,可以通过以下文章进行了解

坑点

总体来说模版的编写还是很简单的。想要的功能大多可以在预设模版中找到。把需要使用的功能从预设模版中copy过来修改就可以了。

  • 在合并AndroidManifest的时候一直提示合并冲突,AndroidManifest合并到项目中就在</manifest>标签外了。最后查出来是我编写模版Manifest文件时少了一个>符号。所以对于没有lint检查的ftl文件写的时候一定要注意好仔细一点,否则会导致意想不到的问题。
  • 由于需要生成的类有点多,统一命名的时候需要用freemarker来对输入的字符串进行处理,如果用法不对就会导致创建时候androidstudio卡死。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容