Android Template使用
由于在項目中使用了Mvp+Dagger的模式進行開發(fā)涮阔,在實際使用中針對一個頁面需要建六七個頁面汛闸,而這里面很多代碼是重復(fù)性的,所以考慮要使用Template來提高工作效率
參考文章:
- http://blog.csdn.net/lmj623565791/article/details/51635533
- https://developer.android.com/studio/projects/templates.html
具體的使用方法在上面的文章中已經(jīng)有了講解,我這里就記錄一下自己的使用經(jīng)過涮拗。
AndroidStudio提供的有多種模版媒抠,位置在
{AndroidStudio安裝目錄}/plugins/android/lib/templates/
對應(yīng)到我的機器上是:
/Users/xxx/Applications/Android Studio.app/Contents/plugins/android/lib/templates/activities/
這個目錄下有As自己預(yù)設(shè)好的各種模版善玫,我們在 new-> activity->BasicActivity操作的時候使用的就是這里的預(yù)設(shè)模版工窍。
我們需要做的是把我們自己寫好的模版(Mvp Activity)放到這個目錄的/activitys目錄下,重啟AndroidStudio壁畸。就可以在new->activity->Mvp Activity中使用我們自己寫的模版了贼急。
通過對預(yù)設(shè)模版的分析,發(fā)現(xiàn)目錄結(jié)構(gòu)如下:
- root/
- root/res(該目錄下是放置資源文件的)
- root/src(該目錄下是放置源代碼的)
- globals.xml.ftl(該文件配置全局變量)
- recipe.xml.ftl(該文件負(fù)責(zé)具體的文件merge 命名 打開文件等操作)
- template.xml(該文件定義新建輸入項)
root/res root/src
root/res以及root/src目錄下放置我們的資源文件以及源代碼文件捏萍,對應(yīng)我們開發(fā)時項目目錄結(jié)構(gòu)下的res目錄和src目錄太抓,res里面有values layout等文件夾,資源文件可以通過recipe里的merge命令合并到我們項目中的res目錄下令杈。源代碼文件通過instantiate命令重命名并遷移到對應(yīng)目錄下走敌。這里的所有文件后綴名都是ftl。
#TempMvpActivity.java.ftl
package ${packageName};
/**
* @author lsp
* @created 17/3/3 16:38
*/
public class ${activityClass}Activity extends Activity{
}
打開我們的一個activity文件逗噩,其中代碼部分跟我們自己寫的activity是一樣的掉丽,只是需要替換掉的部分用變量替換掉就可以在通過模版生成代碼時候自動讀取變量生成對應(yīng)的文件以及代碼了。
globals.xml.ftl
globals文件是用來定義全局變量以及引入系統(tǒng)預(yù)設(shè)全局變量的
#globals.xml.ftl
<?xml version="1.0"?>
<globals>
<global id="hasNoActionBar" type="boolean" value="false" />
<#include "../common/common_globals.xml.ftl" />
</globals>
我們也可以自己在這里定義我們需要的變量异雁,然后通過$(hasNoActionBar)這樣的方式來進行調(diào)用捶障。
include的通用目錄在
/Applications/Android Studio.app/Contents/plugins/android/lib/templates/activities/common
recipe.xml.ftl
recipe文件是用來實際操作生成模版的,他包含了一系列操作標(biāo)簽:
#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>
上面這個是我生成模版用的纲刀,里面包含的標(biāo)簽如下:
- <#include> 是引入其他的配置文件的项炼,我這里用到了AndroidManifest的合并,所以我把合并的文件引入進來示绊。當(dāng)然AndroidManifest的合并操作直接在該文件里面寫也是沒問題的芥挣。
- copy
<copy from="root/res/drawable-hdpi"
to="${escapeXmlAttribute(resOut)}/drawable-hdpi" />
這個操作符可以把我們模版里的資源文件復(fù)制到對應(yīng)的項目資源目錄下
- 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
這個文件是用來定義新建時候的輸入項的。
<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 :通過該標(biāo)識析恢,獲取輸入的內(nèi)容$(activityClass)
- name:輸入框左邊的提示語
- type : 輸入值類型 可以為string或者boolean
- constraints:填寫值的約束墨坚,比如不能為空,是否唯一
- suggest:建議值
- default:默認(rèn)值
- help:輸入框獲取焦點時底部顯示的提示語
這個文件里定義的每一項都會在新建時候展示出來讓使用者輸入或者選擇映挂。然后對應(yīng)的變量會在生成模版時候使用泽篮。
freemarker
在我們編寫模版時候使用到的freemarker,可以通過以下文章進行了解
坑點
總體來說模版的編寫還是很簡單的柑船。想要的功能大多可以在預(yù)設(shè)模版中找到帽撑。把需要使用的功能從預(yù)設(shè)模版中copy過來修改就可以了。
- 在合并AndroidManifest的時候一直提示合并沖突鞍时,AndroidManifest合并到項目中就在</manifest>標(biāo)簽外了亏拉。最后查出來是我編寫模版Manifest文件時少了一個>符號。所以對于沒有l(wèi)int檢查的ftl文件寫的時候一定要注意好仔細(xì)一點逆巍,否則會導(dǎo)致意想不到的問題及塘。
- 由于需要生成的類有點多,統(tǒng)一命名的時候需要用freemarker來對輸入的字符串進行處理锐极,如果用法不對就會導(dǎo)致創(chuàng)建時候androidstudio卡死笙僚。