引言
Android Studio提供的代碼模板可幫助我們減少重複編寫同一段代碼的負擔,而且可以遵循優化後的設計和標準。AS採用的是Apache FreeMarker模板引擎。
在網上,關於模板開發的資料比較少,而且Studio版本較低,也缺少實際開發中很多功能的示例(比如說Studio在加入kotlin後,我們怎麼生成kotlin的模板)。這篇文章將基於TemplateBuilder模板插件,簡化模板生成的難度。
環境:
Android Studio 3.1.1
TemplateBuilder 2.0
一、TemplateBuilder
簡單介紹下TemplateBuilder的使用。
1.插件安裝
在Studio菜單欄選擇【File】-【Settings】,在左側菜單中選擇【Plugins】,點擊【Browse repositories】。在彈出框中輸入TemplateBuilder,點擊安裝並重啓Studio後生效。
2.創建模板
1.定義模板:
這裏定義了activityName、textViewName變量,之後在生成模板時,由用戶輸入。
public class ${activityName} extends AppCompatActivity {
private TextView ${textViewName};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
2.生成模板
選中模板文件,按下【ALT + T】(或在Tools下選擇Generate Template),配置模板信息
屬性說明:
- Template Category 對應模板的分類,對應選擇導入模板時的模板分類,這裏默認值是電腦的用戶名。
- Template Name 對應模板名稱,對應選擇導入模板時的模板名稱,默認值是當前的Project名稱。
- Template Description 對應模板描述信息,對應導入模板時彈出的導入界面的文字描述,默認爲空。
- Template Folder 對應生成模板所存放的位置,如果是Mac操作系統則默認爲/Applications/Android Studio.app/Contents/plugins/android/lib/templates, Windows系統的話由於差異比較大,就默認爲空了,可以自行配置[Android Studio安裝目錄]/plugins/android/lib/templates(這裏只需要配置一次即可,插件將自動保存該位置)。
- Input data 配置模板變量
在【Configure Template Data】下點擊【add】配置剛纔模板中定義的變量,配置完畢後點擊【Finish】。
重啓Studio後就可使用該自定義模板。
關於Input data的使用,先解釋下每個屬性對應的含義
- id 變量名,必須和模板中使用的變量名對應,必填
- name 變量簡介,必填
- type 變量類型,string和boolean兩種,通過下拉框選擇,必填
- default 變量對應的默認值,選填
- help 添加該變量時的提示信息,選填
二、定義模板
這裏我使用TemplateBuilder插件生成mvp的模板。通過修改相關的屬性,實現Activity和layout動態生成,並在AndroidManifest.xml中註冊。最後添加kotlin的模板配置,這樣模板最終完成。
1.創建Java模板
首先創建一個MVP的Activity,將動態的屬性聲明爲變量。
package ${packageName};
import android.os.Bundle;
import com.blackbox.medicalpension.common.mvp.base.BaseCommonActivity;
import com.blackbox.medicalpension.common.mvp.mvp.BasePresenter;
import org.jetbrains.annotations.Nullable;
import java.util.List;
public class ${activityClass} extends BaseCommonActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.${layoutName});
initTitleWithBack("${titleName}");
}
@Nullable
@Override
public List<BasePresenter<?>> createPresenter() {
return null;
}
}
創建對應的Layout佈局文件
<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white">
<include
android:id="@+id/include_layout"
layout="@layout/lin_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
2.模板生成
選中兩個模板文件,點擊【ALT + T】,彈出【Configure Template Data】窗口。定義activityClass、layoutName、titleName三個變量,並【Finish】,生成模板。
模板文件存放在…\Android Studio\plugins\android\lib\templates下
模板文件後綴名都是以【.ftl】結尾。
- globals.xml.ftl 全局變量文件 存放的是一些全局變量
- recipe.xml.ftl 配置要引用的模板路徑以及生成文件的路徑
- template.xml 模板的配置信息,以及要輸入的參數.定義了模板的流程框架 基本結構
- template_blank_activity.png 顯示的縮略圖(只是展示用)
- LinActivity.java.ftl Activity模板文件
1.修改配置
進入到…\Android Studio\plugins\android\lib\templates\linw9目錄下
1.修改template.xml文件
爲方便用戶輸入Activity名稱或Layout名稱,自動提示Layout或Activity名稱,需要在文件中添加兩個屬性:
constraints=”class|unique|nonempty”
suggest=”${layoutToActivity(layoutName)}”
suggest=”${activityToLayout(activityClass)}”
<?xml version="1.0"?>
<template
format="5"
revision="5"
name="LinMvpActivity"
minApi="7"
minBuildApi="14"
description="Mvp Activity">
<category value="linw9" />
<formfactor value="Mobile" />
<!-- input data -->
<parameter
id="activityClass"
name="Activity Name"
type="string"
constraints="class|unique|nonempty"
suggest="${layoutToActivity(layoutName)}"
default="MvpActivity"
help="" />
<parameter
id="layoutName"
name="Layout Name"
type="string"
constraints="layout|unique|nonempty"
suggest="${activityToLayout(activityClass)}"
default="activity_mvp"
help="" />
<parameter
id="titleName"
name="Title Name"
type="string"
default="Title"
help="" />
<!-- 128x128 thumbnails relative to com.puke.template.xml -->
<thumbs>
<!-- default thumbnail is required -->
<thumb>template_cover.png</thumb>
</thumbs>
<globals file="globals.xml.ftl" />
<execute file="recipe.xml.ftl" />
</template>
2.修改AndroidManifest.xml文件
進入到…\Android Studio\plugins\android\lib\templates\linw9\LinMvpActivity\root 目錄下,打開AndroidManifest.xml.ftl文件,修改內容讓Studio自動註冊Activity。需要注意的是:需要對AndroidManifest進行代碼格式化(Format),不然使用的時候Studio可能會提示Merge。
只針對Java代碼的模板到此結束,重新啓動Studio後即可使用該模板。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="${packageName}">
<application>
<activity android:name="${packageName}.${activityClass}">
</activity>
</application>
</manifest>
3.增加Kotlin模板
在網上,我沒有查找到關於Kotlin模板配置的相關文章,這裏給大家講解下我的方法。
我是通過學習Studio自帶的模板,從中找到了配置Kotlin模板的方法,僅供大家參考。
1.創建Kotlin模板
進入到…\Android Studio\plugins\android\lib\templates\linw9\LinMvpActivity\root\src\app_package目錄下,直接創建kotlin模板
package ${packageName}
import android.os.Bundle
import com.blackbox.medicalpension.common.mvp.base.BaseCommonActivity
import com.blackbox.medicalpension.common.mvp.mvp.BasePresenter
import kotlinx.android.synthetic.main.${layoutName}.*
class ${activityClass} : BaseCommonActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.${layoutName})
initTitleWithBack("${titleName}")
}
override fun createPresenter(): MutableList<BasePresenter<*>> ?{
return null
}
}
2.修改recipe.xml.ftl
進入到…\Android Studio\plugins\android\lib\templates\linw9\LinMvpActivity目錄下,打開recipe.xml.ftl
將java改爲${ktOrJavaExt}變量。
<?xml version="1.0"?>
<recipe>
<instantiate from="root/src/app_package/LinActivity.${ktOrJavaExt}.ftl"
to="${escapeXmlAttribute(srcOut)}/${activityClass}.${ktOrJavaExt}" />
<instantiate from="root/res/layout/activity_lin.xml.ftl"
to="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
<merge from="root/AndroidManifest.xml.ftl"
to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
</recipe>
3.修改globals.xml.ftl
進入到…\Android Studio\plugins\android\lib\templates\linw9\LinMvpActivity目錄下,打開globals.xml.ftl
添加ktOrJavaExt變量聲明:
<?xml version="1.0"?>
<globals>
<#assign generateKotlin=(((includeKotlinSupport!false) || (language!'Java')?string == 'Kotlin'))>
<global id="generateKotlin" type="boolean" value="${generateKotlin?string}" />
<global id="ktOrJavaExt" type="string" value="${generateKotlin?string('kt','java')}" />
<global id="resOut" value="${resDir}" />
<global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
<global id="relativePackage" value="<#if relativePackage?has_content>${relativePackage}<#else>${packageName}</#if>" />
</globals>
4.結束
重啓Studio後,就可以生成Java或Kotlin的代碼。對於寫的不好的地方,希望大家多提建議。
三、其它
源碼地址:https://download.csdn.net/download/u010987039/10360074
碼雲地址:https://gitee.com/personlin/emplate_java_kotlin
GitHub地址:https://github.com/linw992/Template