Android技术

Android Studio上Template(模板)的开发进阶

2020-05-25  本文已影响0人  海_3efc

Android Studio上Template(模板)的开发基础篇

引言

是上节基础篇中讲解了,如果通过AS第三方的插件进行创建模板。算是创建模板比较入门的一种方式,如果不知道的可以去看下。
实际上在Android开发中很多生成多个文件,比如:生成Activity的时候,想要生成layout、在AndroidManifest中注册;再比如:MVP框架,新建一个Activity或Fragment,生成MVP相关的view、presenter、model层文件等等。这些需求用插件生成模板的方式就无法实现了,本篇我们就来讲讲如何随心所欲的创建我们需要的模板。

进阶

这就需要通过手动修改配置文件及模板文件,下面从以下几个方面入手。

一、技术准备

前文中开篇就说过,AS中模板使用到的模板引擎是FreeMarker,那么就离不开对FreeMarker基础语法的学习。
FreeMarker基础语法
文档中有详细描述了各个指令和各个函数的功能,建议收藏以便查询。

A36AAEB6.jpg

英语基础不好的可以点击下面指示,进行下载中文文档:


中文文档下载引导.png
二、常用模板语法讲述
1.常用指令集
<#global name=value>
或
<#global name1=value1 name2=value2 ... nameN=valueN>

其中,name是名称,value是值。
实例:

在AS自带的模板中是这样的使用的
<global id="hasNoActionBar" type="boolean" value="false" />

这种方式也可以,增加几个扩展属性,更容易理解些。

<#if condition>
  满足条件执行此处
<#elseif condition2>
  ...
<#elseif condition3>
  ...
...
<#else>
  ...
</#if>

condition 条件表达式
例子:

<#if (activityClass?lower_case?ends_with("activity"))>
    <global id="mvpFileName" type="string" value="${activityClass?replace('Activity','')?cap_first}"/>
    <global id="newActivityName" type="string" value="${activityClass?cap_first}" />
<#else>
    <global id="mvpFileName" type="string" value="${activityClass?cap_first}"/>
    <global id="newActivityName" type="string" value="${activityClass?cap_first}Activity" />
</#if>
重点!重点!重点!

建议表达式用括号括起来
因为这里有个坑,比如:表达式“abc”?length > 0,如果不加括号,会报错提示:表达式值是Bool型的,不是int型;也就是说只识别了“abc”?length部分,只有加了括号引擎才能将表达式整体识别。

<#import "root://activities/common/kotlin_macros.ftl" as kt>
<#include "../common/recipe_simple.xml.ftl" />
<#local name=value>

例子:

<#local "index"=1 >
2.常见内建函数

以上就是常用的内建函数,如需了解更多,可以查看官方文档。


A44F72AD.png
三、实战

经过上面无聊而啰嗦的文字描述,下面我们就一起来完善基础篇中的例子,生成Activity,并生成layout,并在AndroidManifest.xml中进行Activity注册。
还以基础篇中提到的例子为基础,进入模板目录


image.png
1.打开template.xml增加输入参数

打开template.xml文件,新增一个叫generateLayout的参数,并设置默认值为true

<!-- 新增加一个输出参数,控制是否需要创建布局文件 -->
    <parameter
        id="generateLayout"
        name="Generate Layout File"
        type="boolean"
        default="true"
        help="If true, a layout file will be generated" />

会在界面中增加了输入参数,如下图:


image.png
2.修改recipe.xml.ftl文件

由于我们要生成layout文件,从recipe.xml.ftl内容看是不存在生成layout文件配置,因此我们要手动增加配置。

<?xml version="1.0"?>
<recipe>

    <instantiate from="root/src/app_package/MyTemplateActivity.java.ftl"
        to="${escapeXmlAttribute(srcOut)}/${activityName}.java" />

    <merge from="root/AndroidManifest.xml.ftl"
           to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />

    
    <!-- 增加生成layout文件 generateLayout 是在template.xml定义的输入参数-->
    <#if generateLayout>
        <instantiate from="root/res/layout/activity_template.xml.ftl"
               to="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
    </#if>
</recipe>

其中activity_template.xml.ftl文件未生成layout的模板,存放目录为:root/res/layout/

3.新增layout模板文件

activity_template.xml.ftl模板内容如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${packageName}.${activityName}">

    <TextView
        android:id="@+id/username"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="24dp"
        android:layout_marginTop="96dp"
        android:layout_marginEnd="24dp"
        android:text="myTemplate"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>
    
</android.support.constraint.ConstraintLayout>

编写到此处,就可以重启AS尝试下是否能成功布局文件了。下面是我在本机上运行生成的layout文件


image.png
4.在AndroidManifest.xml中注册新建的Activity

同理,想在AndroidManifest.xml中注册activity,我们就要先创建我们的AndroidManifest.xml模板,如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="${packageName}">
    <application>
        <activity android:name=".${activityName}"></activity>
    </application>
</manifest>

这里简单注册了一个<activity>,没有给activity添加其他属性,这里你可以自己添加自己的属性,比如theme和screenOrientation等属性。
当然别忘记了在recipe.xml.ftl中增加对AndroidManifest.xml的配置,如下:

<merge from="root/AndroidManifest.xml.ftl"
           to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />

到此就能正常在AndroidManifest.xml中注册我们生成的Activity了
同理重启AS,使用模板,如下图生成结果:


image.png

好了,到这里我们开发模板讲解基本结束了。

总结

刚开始时可能比较生疏,要多练习,多摸索下。
另外AS自带有插件模板(目录:Android Studio\plugins\android\lib\templates),也可以拿来研究下,慢慢就能掌握很多技巧。

另附带上本文的模板例子和自定义的一个MVp模板

上一篇下一篇

猜你喜欢

热点阅读