Android Studio Template(模板)開發(fā)

引言

Android Studio提供的代碼模板可幫助我們減少重復編寫同一段代碼的負擔,而且可以遵循優(yōu)化后的設計和標準养渴。AS采用的是Apache FreeMarker模板引擎捂敌。
在網上窖逗,關于模板開發(fā)的資料比較少显熏,而且Studio版本較低,也缺少實際開發(fā)中很多功能的示例(比如說Studio在加入kotlin后唐断,我們怎么生成kotlin的模板)。這篇文章將基于TemplateBuilder模板插件杭抠,簡化模板生成的難度脸甘。
環(huán)境:
Android Studio 3.1.1
TemplateBuilder 2.0

一、TemplateBuilder

簡單介紹下TemplateBuilder的使用偏灿。

1.插件安裝

在Studio菜單欄選擇【File】-【Settings】丹诀,在左側菜單中選擇【Plugins】,點擊【Browse repositories】翁垂。在彈出框中輸入TemplateBuilder铆遭,點擊安裝并重啟Studio后生效。


這里寫圖片描述

2.創(chuàng)建模板

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操作系統(tǒng)則默認為/Applications/Android Studio.app/Contents/plugins/android/lib/templates剃袍, Windows系統(tǒng)的話由于差異比較大,就默認為空了车海,可以自行配置[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動態(tài)生成萝挤,并在AndroidManifest.xml中注冊御毅。最后添加kotlin的模板配置,這樣模板最終完成怜珍。

1.創(chuàng)建Java模板

首先創(chuàng)建一個MVP的Activity端蛆,將動態(tài)的屬性聲明為變量。

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;
    }
}

創(chuàng)建對應的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.創(chuàng)建Kotlin模板

進入到...\Android Studio\plugins\android\lib\templates\linw9\LinMvpActivity\root\src\app_package目錄下垦梆,直接創(chuàng)建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

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市摆尝,隨后出現的幾起案子温艇,更是在濱河造成了極大的恐慌,老刑警劉巖堕汞,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勺爱,死亡現場離奇詭異,居然都是意外死亡讯检,警方通過查閱死者的電腦和手機琐鲁,發(fā)現死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來人灼,“玉大人围段,你說我怎么就攤上這事⊥斗牛” “怎么了奈泪?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長灸芳。 經常有香客問我涝桅,道長,這世上最難降的妖魔是什么烙样? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任冯遂,我火速辦了婚禮,結果婚禮上谒获,老公的妹妹穿的比我還像新娘蛤肌。我一直安慰自己,他們只是感情好批狱,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布裸准。 她就那樣靜靜地躺著,像睡著了一般精耐。 火紅的嫁衣襯著肌膚如雪狼速。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天卦停,我揣著相機與錄音向胡,去河邊找鬼。 笑死惊完,一個胖子當著我的面吹牛僵芹,可吹牛的內容都是我干的。 我是一名探鬼主播小槐,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼拇派,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凿跳?” 一聲冷哼從身側響起件豌,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎控嗜,沒想到半個月后茧彤,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡疆栏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年曾掂,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壁顶。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡珠洗,死狀恐怖,靈堂內的尸體忽然破棺而出若专,到底是詐尸還是另有隱情许蓖,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布调衰,位于F島的核電站膊爪,受9級特大地震影響,放射性物質發(fā)生泄漏窖式。R本人自食惡果不足惜蚁飒,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望萝喘。 院中可真熱鬧淮逻,春花似錦、人聲如沸阁簸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽启妹。三九已至筛严,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間饶米,已是汗流浹背桨啃。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工车胡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人照瘾。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓匈棘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親析命。 傳聞我的和親對象是個殘疾皇子主卫,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內容