提高开发效率之安卓模板(上面有四种模板的教程,我之前会两种,看完之后还是只会两种2333)
原文地址:?juejin.im/post/5c7339…
在平時的開發工作中,我們經常將一個地方的代碼,復制粘貼到另外一個地方,俗稱搬磚,搬磚搬多了,作為一個資深的挨踢民工,難免會總結一些提高生產力的搬磚經驗
?
?
?
Android Studio 模板是個提高生產力的好東西,使用過 MVPArms 的朋友,都應該使用過我提供的配套模板,使用該套模板,一鍵即可生成整個頁面需要的所有文件,甚至還可以一鍵生成整個 Module,真正的解放了大家的雙手,讓大家的雙手可以去做更多熱愛的事情
?
?
?
Android Stuidio 模板一共有 4 種類型,分別對應不同的功能,我先來簡單介紹下這 4 種模板,最后再著重介紹下一鍵生成 Module 的模板,因為前面 3 種模板在網上有太多優秀的教程了,而 Module 模板的資料非常少,我再重復寫一遍前 3 種模板的教程也不一定有別人寫得好,意義并不大,所以我前面只做簡單介紹,后面會貼出一些教程鏈接,沒了解過的就當科普了,了解過的就直接跳過
?
?
Live Templates
Live Templates 的功能主要是根據關鍵字快速生成代碼塊
?
?
?
在設置中找到 Live Templates,點擊紅框中的按鈕 "+",即可新建 Live Templates
?
?
?
File Templates
File Templates 顧名思義,主要功能就是一鍵生成單個文件
?
?
?
在設置中找到 File and Code Templates,點擊紅框中的按鈕 "+",即可新建 File Templates
?
?
?
Activity Templates
Activity Templates 可以一鍵生成多個文件,但不光可以生成 Activity 文件,還可以根據需求生成任何 Java 文件、XML 文件以及其他類型的文件
?
?
?
新建 Activity Templates 要比上面的兩個模板復雜的多,需要使用到 FreeMarker,感興趣的朋友,可以看看我開源的 Activity Templates,稍微修改一下就能應用到自己的項目當中
module Templates
module Templates 可以一鍵生成 Module 以及 Module 中所需要的所有文件
?
?
?
module Templates 也是使用 FreeMarker 創建的,如果你能理解 Activity Templates,那你也可以快速的新建一個 module Templates
詳解 module Templates
不知道大家了解過一鍵生成 Module 的 Android Stuidio 模板嗎,這種類型的模板我在網上沒搜到有相關的開源庫和文章,所以我就自己研究了一段時間,在去年就開源給了 MVPArms 的使用者
Module Templates 其實要比 Activity Templates 簡單很多,因為 Module Templates 的某些限制,導致它的配置面板不能自定義一些新增的功能,所以復雜性降低很多,但是功能性和靈活性就要弱于 Activity Templates,不過即使這樣也能滿足我們大部分的需求了
Android Studio 中所有的 module Templates 都放在 gradle-projects 這個目錄中(Android Studio 安裝目錄/plugins/android/lib/templates/gradle-projects),如果按照很多教程中對 Activity Templates 學習方法的描述,我們應該按照和 Activity Templates 一樣的學習方式,打開 gradle-projects 目錄中的 NewAndroidModule 進行學習
?
?
?
但是我可以告訴大家,在你沒有足夠經驗的情況下,最好不要這樣做,因為這個文件夾中包含著 Android Studio 創建 Android Module 所需要的所有文件和代碼,里面比較復雜,有很多判斷條件,很多東西對你的項目來說都用不到,在學習時會耽誤你很多時間
?
?
?
所以為了讓大家快速上手,我就用我已經開源的 module Templates 作為學習案例,里面的所有文件和代碼都是經過我篩選過后提取出來的,非常易于大家學習和理解
module Templates 結構
NewArmsComponent ├── root │ ├── res //Module 中的資源文件都放這里 │ ├── ├── anim │ ├── ├── layout │ ├── ├── mipmap-hdpi │ ├── ├── mipmap-xhdpi │ ├── ├── mipmap-xxhdpi │ ├── ├── mipmap-xxxhdpi │ ├── ├── values │ ├── src/app_package //Module 中的源文件模板都放這里 │ ├── ├── ActivityLifecycleCallbacksImpl.java.ftl │ ├── ├── Api.java.ftl │ ├── ├── AppLifecyclesImpl.java.ftl │ ├── ├── ... │ ├── test/app_package //Module 中的測試文件模板都放這里 │ ├── ├── ExampleInstrumentedTest.java.ftl │ ├── ├── ExampleUnitTest.java.ftl │ ├── AndroidManifest.xml.ftl //AndroidManifest.xml 模板文件 │ ├── CMakeLists.txt.ftl //不用 CMake 可以忽略 │ ├── build.gradle.ftl //App build.gradle 模板文件 │ ├── native-lib.cpp.ftl //不用 C 可以忽略 │ ├── root-build.gradle.ftl //根目錄 build.gradle 模板文件 │ ├── settings.gradle.ftl //settings.gradle 模板文件 ├── globals.xml.ftl ├── recipe.xml.ftl ├── template.xml ├── template_new_project.png 復制代碼root 文件夾下包含的是生成 Module 所需要的模板文件,template_new_project.png 是模板的封面圖,globals.xml.ftl 我們暫時用不到,recipe.xml.ftl、template.xml 這兩個文件存放的是模板的配置參數,是整個模板的核心文件,我們來看看這兩個文件
template.xml
template.xml 放置的是配置面板的參數,配置面板是什么東西?看下圖
?
?
?
module Templates 和 Activity Templates 的配置面板不一樣,Activity Templates 可以任意修改和新增配置面板中的項目,但是 module Templates 不可以,只能固定為圖中的這四項
看看 template.xml 里面的內容
<?xml version="1.0"?> <templateformat="5"revision="2"name="MVPArms Module"description="Creates a new MVPArms Module."><category value="Application" /><formfactor value="Things" />----------------------- 分割線 -----------------------<thumbs><thumb>template_new_project.png</thumb></thumbs><parameterid="packageName"name="Package name"type="string"constraints="app_package|nonempty"default="com.mycompany.myapp" />...<globals file="globals.xml.ftl" /><execute file="recipe.xml.ftl" /> </template> 復制代碼只用看分割線以上的標簽即可,下面的標簽基本用不上,每個 parameter 標簽在配置面板中都對應一個項目,但 parameter 標簽只在 Activity Templates 中可以任意修改和新增,在 module Templates 中的任何修改和新增都是無效的,這點大家可以試試
name 標簽和 description 標簽顧名思義,這就不用多解釋了,category 標簽固定為 Application 即可
這里要特別要提一下 formfactor 標簽,在 NewAndroidModule 中,formfactor 標簽的值為 Mobile,最開始我也和它一樣,將值賦為 Mobile,結果發現無法生成文件,我想可能是 Android Studio 只允許存在一個 Android 的 Module 模板,我又試著改成了 TV、Glass、Wear ...,發現都不完美,要不是無法生成文件,要不就生成太多不需要的文件,最后改成 Things 后,效果就接近完美了
recipe.xml.ftl
recipe.xml.ftl 的功能就是告訴模板引擎,你打算怎么處理你的模板文件
<?xml version="1.0"?> <!-- TODO: check include Cpp support; add driver module template --> <recipe><mkdir at="${escapeXmlAttribute(projectOut)}/libs" /><mkdir at="${escapeXmlAttribute(resOut)}/anim" /><mkdir at="${projectOut}/src/main/java/${slashedPackageName(packageName)}/app/utils" /><merge from="root/settings.gradle.ftl"to="${escapeXmlAttribute(topOut)}/settings.gradle" /><merge from="root/root-build.gradle.ftl"to="${escapeXmlAttribute(topOut)}/build.gradle" /><copy from="root/res/mipmap-hdpi/ic_launcher.png"to="${escapeXmlAttribute(resOut)}/mipmap-hdpi/ic_launcher.png" /><copy from="root/res/mipmap-xhdpi/ic_launcher.png"to="${escapeXmlAttribute(resOut)}/mipmap-xhdpi/ic_launcher.png" /><copy from="root/res/mipmap-xxhdpi/ic_launcher.png"to="${escapeXmlAttribute(resOut)}/mipmap-xxhdpi/ic_launcher.png" /><copy from="root/res/mipmap-xxxhdpi/ic_launcher.png"to="${escapeXmlAttribute(resOut)}/mipmap-xxxhdpi/ic_launcher.png" /> <instantiate from="root/build.gradle.ftl"to="${escapeXmlAttribute(projectOut)}/build.gradle" /><instantiate from="root/AndroidManifest.xml.ftl"to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" /><instantiate from="root/res/values/styles.xml.ftl"to="${escapeXmlAttribute(resOut)}/values/styles.xml" /><instantiate from="root/src/app_package/GlobalConfiguration.java.ftl"to="${projectOut}/src/main/java/${slashedPackageName(packageName)}/app/GlobalConfiguration.java" /><open file="${projectOut}/src/main/java/${slashedPackageName(packageName)}/app/GlobalConfiguration.java" /><instantiate from="root/src/app_package/AppLifecyclesImpl.java.ftl"to="${projectOut}/src/main/java/${slashedPackageName(packageName)}/app/AppLifecyclesImpl.java" /><open file="${projectOut}/src/main/java/${slashedPackageName(packageName)}/app/AppLifecyclesImpl.java" /><#if unitTestsSupported><instantiate from="root/test/app_package/ExampleUnitTest.java.ftl"to="${escapeXmlAttribute(unitTestOut)}/ExampleUnitTest.java" /> </#if> </recipe> 復制代碼Module 所需要的模板文件都放在 root 文件夾下,而使用 recipe.xml.ftl 中的標簽就是為了告訴模版引擎,你打算將哪個模板文件通過什么方式放到 Module 中的什么位置
mkdir 標簽,顧名思義,就是生成一個空的文件夾
merge 標簽中的 from 填寫模板文件的地址,to 填寫 Module 中的目標位置,merge 標簽會將 from 中填寫的模板文件,放到 to 中填寫的目標位置上,如果目標位置已經存在一個相同文件名的文件,則將模板文件中的全部內容復制到已經存在的文件中,否則則創建一個新的文件
copy 標簽會將 from 中填寫的文件,放到 to 中填寫的目標位置上,如果目標位置已經存在一個相同文件名的文件,則會覆蓋此文件
instantiate 標簽會將 from 中填寫的模板文件,放到 to 中填寫的目標位置上,如果目標位置已經存在一個相同文件名的文件,則會覆蓋此文件,看描述和 copy 標簽差不多,那它們的區別是什么呢?
copy 標簽的目標對象是普通文件,也就是沒有 .ftl 后綴的文件,instantiate 標簽的目標對象是模板文件,也就是有 .ftl 后綴的文件,那有 .ftl 后綴的文件和沒有 .ftl 后綴的文件有什么區別呢?
有 .ftl 后綴的文件中可以使用 FreeMarker 語法,在生成文件時,模版引擎會根據文件中的 FreeMarker 語法對文件內容進行相應的修改,比如根據不同的條件生成不同的內容,而沒有 .ftl 后綴的文件,文件中的內容一旦確定在生成時是無法改變的,就如同單純的復制粘貼
${escapeXmlAttribute(resOut)} 對應的是 Module 中的 res 文件夾
{slashedPackageName(packageName)} 對應的是包名下的根目錄
${escapeXmlAttribute(topOut)} 對應的是整個工程的根目錄
${escapeXmlAttribute(projectOut)} 對應的是 Module 的根目錄
{escapeXmlAttribute(testOut)} 對應的是 Module 中放置測試文件的文件夾
模板文件
root 文件夾下模板文件的編寫也不難,因為 module Templates 沒有用到自定義變量,所以大多數情況下,就是將你寫好的 java 文件,后面加上 .ftl 后綴即可,看看下面我貼出的源代碼鏈接,你很快就能上手
你如果還想學到更多的 FreeMarker 語法,可以翻翻下面貼出的 FreeMarker 中文文檔
開源代碼鏈接
我給 MVPArms 寫的 File Templates
我給 MVPArms 寫的 Activity Templates
我給 MVPArms 寫的 module Templates
我給組件化項目寫的 module Templates
教程鏈接
快速寫出 Activity Templates 的插件
Live Templates 教程
File Templates 教程
Activity Templates 教程
FreeMarker 中文文檔
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的提高开发效率之安卓模板(上面有四种模板的教程,我之前会两种,看完之后还是只会两种2333)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 把Spring Boot项目打为可执行j
- 下一篇: 坑爹的微信支付(签名错误)