查看原文
其他

在Android Studio中编写一个自己的模板

埋心。 郭霖 2019-05-22



今日科技快讯


4月21日晚间,上海一辆特斯拉在地库中突然自燃。对此特斯拉表示,在得知事故后,昨晚公司第一时间派出团队赶往现场,目前正在积极联络相关部门并配合核实情况。


作者简介


大家早上好,本篇文章来自 埋心。的投稿,和大家分享了如何编写一个Android Studio 模板进行以提高开发的效率,相信会对大家有所帮助!同时也感谢作者贡献的精彩文章。

埋心。的博客地址:

https://me.csdn.net/qq_31910313


效果



学习LoginActivity模板


首先我们打开studio安装目录找到系统原生模板,D:\Program Files\Android\studio\plugins\android\lib\templates\activities 这个是我的安装目录,在这里我们可以看到很多原生模板代码可以参考及借鉴,下面我们举例将LoginActivity用sublimeText打开,如果本地没有请自行下载。

在这里我们可以看到root文件下存放的是res和src两个文件夹对应的就是我们在开发时的目录这里不过多解释。

  1. global:里面存放的是全局变量

  2. recipe:这个文件会去获取template文件的id然后去创建相对应模板

  3. template:给使用模板用户所看到的页面


自己编写一个简单mvp模板


首先我们去创建一个模板名称为mvp,接着打开template文件我们设置下name和description。

<template
        format="5"
        revision="1"
        name="Mvp"
        description="第一个插件模板的诞生之路1">


    <category value="Activity"/>
    <formfactor value="Mobile"/>
</template>

这时在通过studio工具查看模板就会发现刚才自定义模板已经生成了可以在studio->new->Activity中查看到。

下面我们创建MvpLoginActivity的模板,打开template.xml

<parameter
       id="activityClass"
       name="Activity Name"
       type="string"
       constraints="class|nonempty"
       help="hexl 测试模板 Activity"/>

打开recipe.xml.ftl文件。

<#-- 创建一个实例
    from:从指定路径下引入该模板文件,相关模板代码都将在该文件中创建
    to:输出到指定的目录
       mvpPath、 相当于变量,该变量在global文件中进行定义
 -->

<instantiate from="root\src\app_package\LoginActivity.java.ftl"
                       to="${mvpPath}ui/activity/${activityClass}Activity.java"/>


<#-- 打开创建的文件 -->
<open file="${mvpPath}ui/activity/${activityClass}Activity.java"/>

在这里我们看到有两个变量分别是mvpPath和activityClass两个变量,mvpPath在globals.xml.ftl定义。

<global id="mvpPath" type="string" value="${escapeXmlAttribute(srcOut)}/mvp/"/>

activityClass就是引用template.xml定义的activity ID。Presenter 和 Model 都是一样的代码可以创建出来,这里不再展示,文章结束会给出源码。


类名与Layout联动


Activity和Layout名称联动

我们要实现输入类名时布局名称也随之联动,主要看下suggest这个参数

<!-- 创建布局 -->
<parameter
        id="layoutActivityClass"
        name="Activity Layout"
        constraints="layout|nonempty"
        default="activity_main"
        suggest="${activityToLayout(activityClass)}"
        help="hexl 测试模板 Layout"/>

Fragment和Layout名称联动

<!-- 创建Fragment -->
<parameter
       id="fragmentClass"
       name="Fragment Name"
       type="string"
       constraints="class|nonempty"
       help="hexl 测试模板 Fragment"/>

<!-- 创建布局
        Fragment 布局名称联动与Activity 不一样,需要特别注意
    -->

<parameter
       id="layoutFragmentClass"
       name="Fragment Layout"
       constraints="layout|nonempty"
       default="fragment_main"
       suggest="fragment_${classToResource(fragmentClass)}"
       help="hexl 测试模板 Layout"/>

Adapter和itemLayout名称联动

<parameter
       id="adapterClass"
       name="Adapter Name"
       type="string"
       constraints="class|nonempty"
       help="Adapter 将被输出到 package.adapter 下"/>

<!--
        adapter item 名称联动与fragment和activity都不一样
        规范是 item_$小写adapterClass
    -->

<parameter
       id="adapterLayoutClass"
       name="Adapter Layout Name"
       type="string"
       suggest="item_${extractLetters(commonName?lower_case)}"
       constraints="class|nonempty"
       visibility="needAdapterLayout"
       help="AdapterLayout 布局文件将被输出到 res/layouts/items/ 下"/>

这里用到了commonName,所以我们要在template定义出来。

<!-- 公共名称 -->
<parameter
       id="commonName"
       name="Common Name"
       type="string"
       constraints="nonempty"
       help="公共名称,作为所有页面的前缀"
       default="Hexl"/>

<instantiate from="root/src/app_package/LoginAdapter.java.ftl"
                     to="${mvpPath}/adapter/${commonName}Adapter.java"/>

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

这里引入了一个simple.xml.ftl文件其实很简单,只要在root->res->layout目录下进行声明就ok了。


生成不同级别目录


例如我们将adapter放到与mvp同一级别目录下,而不是在mvp目录下我们该如何进行骚操作呢?

首先我们在global.xml.ftl文件中定义个变量。

<global id="adapterPath" type="string" value="${escapeXmlAttribute(srcOut)}/adapter/"/>

然后修改recipe.xml.ftl文件输出的目录。

<instantiate from="root/src/app_package/LoginAdapter.java.ftl"
             to="${adapterPath}/${commonName}Adapter.java"/>

下载源码的地址:

https://github.com/HexlDL/Mvp


推荐阅读:

吃透请求流程!深入分析okhttp3源码

没想到Flutter也能实现如此丝般顺滑的上拉抽屉动画效果

自定义一款高性能的Key-Value存储组件


欢迎关注我的公众号,学习技术或投稿

长按上图,识别图中二维码即可关注

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存