
æ°ããã¢ããªã±ãŒã·ã§ã³ãäœæããããã»ã¹ã§ã¯ãåãã¿ã€ãã®ã³ãŒããèšè¿°ããæéã§ãã§ã«ãã¹ããããã¯ã©ã¹æ§é ãåçŸããå¿
èŠãéåžžã«é »ç¹ã«ãããŸãã IDEïŒç¹ã«Android StudioïŒã¯ãã¢ããªã±ãŒã·ã§ã³ã®æ°ããã³ã³ããŒãã³ãã®äœæã«é¢é£ããã¿ã¹ã¯ã倧å¹
ã«ä¿é²ããŸãã ãã³ãã¬ãŒãã¢ã¯ãã£ããã£ã®ãªã¹ãã¯ãSDKããŒã«ã®æ°ããããŒãžã§ã³ããšã«å¢å ããŠããŸãã ããããç¬èªã®ãã³ãã¬ãŒããäœæããå¿
èŠãããå Žåã¯ã©ãã§ããããïŒ åäžã®ãã¡ã€ã«ã®å Žåãããã¯ç°¡åã§ãããè€æ°ã®ãã¡ã€ã«ã§ãã³ãã¬ãŒããäœæããå¿
èŠãããå Žåã¯ã©ãã§ããããïŒ IDEã®æ©èœãç¥ã£ãŠããã°ãã¢ã¯ãã£ããã£ã¯ããŒã¯ã¢ãããã¡ã€ã«ãšå
±ã«äœæããããã©ã°ã¡ã³ããè¿œå ã§ãããããããã¯éåžžã«å®çŸå¯èœã§ãã ãã ãããã®ãããªæ©èœã®èª¬æã¯èŠã€ãããªãã£ãããããã®æ©èœã®è§£æ±ºçãèªåã§æ¢ãå¿
èŠããããŸããã
ã«ããã®äžã§ããã®æ©èœãAndroid Studioã§ã©ã®ããã«å®è£
ããããã«ã€ããŠèª¬æããŸãã
æåã®èãã¯ãJetBrainsã䜿çšããŠããååã«ããã®åé¡ã®è§£æ±ºæ¹æ³ãå°ããããšã§ããã çãã¯éåžžã«ç°¡åã§ããã ã¯ã©ã¹æ§é ãäœæããããã«ãå¿
èŠãªãã¹ãŠã®ã¢ã¯ã·ã§ã³ãå®è¡ããå¥åã®ã¹ã¯ãªãããäœæãããŸããã
å®éããã®ãããªæ±ºå®ãæåã«æãæµ®ãã³ãŸããã ãŸããIDEããã®ç¬ç«æ§ãšããå©ç¹ããããŸãã ãã ããããã¯äžäŸ¿ã§ãããIDEãšã®äºææ§ã®åé¡ã¯åŒãç¶ãéèŠã§ãã
SDKã®ãœãŒã¹ã³ãŒãã«ã¯ãã¿ã¹ã¯ã解決ããæ¹æ³ã®èª¬æããããŸãã
Android IDEãã³ãã¬ãŒãåœ¢åŒ ã
ãã®ãããªéå
·ãåãåã£ãã®ã§ãç§ã¯ããã«ãããè©ŠããŠã¿ãããšã«ãããã®çµéšãæ¥ãã§å
±æããŸããã
FreeMarkerã䜿çšããŠãã³ãã¬ãŒããäœæããã«ã¯ã ããã¯ãPHPããã³Djangoãã³ãã¬ãŒãã®äœ¿çšã«éåžžã«äŒŒãŠããŸãã
äžçªäžã®è¡ã¯ããã©ã¡ãŒã¿ãŒãå
¥åããããã®ç¹å®ã®ãã³ãã¬ãŒããšãã©ãŒã ãããããšã§ãã å
¥ååŸããã©ã¡ãŒã¿ãŒã¯ãã³ãã¬ãŒãã«è»¢éããããã®ããŒã¿ã«åºã¥ããŠå¿
èŠãªã¯ã©ã¹ãåéãããŸãã
䜿çšãããŠãããã¹ãŠã®ãã³ãã¬ãŒãã®ãªã¹ãã¯ã次ã®ã¢ãã¬ã¹ã«ãããŸãã
android-studio-folder \ plugins \ android \ lib \ templates \ãã³ãã¬ãŒããäœæããã«ã¯ã次ã®ãã¡ã€ã«ã®ãªã¹ããå«ãæ°ãããã£ã¬ã¯ããªãã¢ã¯ãã£ããã£ïŒãŸãã¯ãã®ä»ïŒãã£ã¬ã¯ããªã«è¿œå ããŸã

template.xmlããã³recipe.xmlãã¡ã€ã«ã®ã¿ãå¿
èŠã§ãã
template.xml
ãã®XMLãã¡ã€ã«ã«ã¯ãIDEã®ãªãã·ã§ã³ãšããŠäœ¿çšå¯èœãªããŠãŒã¶ãŒã«è¡šç€ºãããååã説æãã«ããŽãªããã©ã¡ãŒã¿ãŒãªã©ããã³ãã¬ãŒãã«é¢ããã¡ã¿ããŒã¿ãå«ãŸããŠããŸãã
template.xmlã®äŸ <template format="4" revision="2" minApi="7" minBuildApi="16" name="Blank Activity" description="Creates a new blank activity, with navigation."> <parameter id="activityClass" name="Activity Name" type="string" constraints="class|unique|nonempty" suggest="${layoutToActivity(layoutName)}" default="MainActivity" help="The name of the activity class to create." /> <parameter id="layoutName" name="Layout Name" type="string" constraints="layout|unique|nonempty" suggest="${activityToLayout(activityClass)}" default="activity_main" help="The name of the layout to create for the activity" /> <parameter id="navType" name="Navigation Type" type="enum" default="none" help="The type of navigation to use for the activity"> <option id="none">None</option> <option id="tabs" minApi="11">Tabs</option> <option id="pager" minApi="11">Swipe Views</option> <option id="dropdown" minApi="11">Dropdown</option> </parameter> <parameter id="fragmentName" name="Fragment Name" type="string" constraints="class|unique|nonempty" default="MainFragment" visibility="navType != 'none'" help="The name of the fragment class to create" /> <thumbs> <thumb>template_default.png</thumb> <thumb navType="tabs">template_tabs.png</thumb> <thumb navType="dropdown">template_dropdown.png</thumb> </thumbs> <globals file="globals.xml.ftl" /> <execute file="recipe.xml.ftl" /> </template>
ãã³ãã¬ãŒãèŠçŽ
formatã¯ããã®ãã³ãã¬ãŒããæºæ ãããã³ãã¬ãŒãã®ããŒãžã§ã³ã§ãã 4ã§ãªããã°ãªããŸããïŒãŸãããã®ããã«ïŒ
ãªããžã§ã³ã¯ãªãã·ã§ã³ã®ãã©ã¡ãŒã¿ãŒã§ãã ãã®ãã³ãã¬ãŒãã®ããŒãžã§ã³ïŒãã³ãã¬ãŒããæŽæ°ããããšã§å¢ããããšãã§ããŸãïŒ
name-ãã³ãã¬ãŒãã®è¡šç€ºåã
description-ãã³ãã¬ãŒãã®èª¬æã
minApiã¯ãªãã·ã§ã³ã®ãã©ã¡ãŒã¿ãŒã§ãã ãã®ãã³ãã¬ãŒãã®æå°APIã¬ãã«ããã§ãã¯ãããŸãã ãã³ãã¬ãŒããäœæããåã«ãIDEã¯minSdkVersionããã®å€ããå°ãããªãããšã確èªããŸãã
ãã©ã¡ãŒã¿èŠçŽ
ãŠãŒã¶ãŒèšå®å¯èœãªãã³ãã¬ãŒããã©ã¡ãŒã¿ãå®çŸ©ããŸãã
id-å€æ°ã®èå¥åã ã°ããŒãã«å€æ°ãã¡ã€ã«ã§å©çšå¯èœã èå¥åãFooã®å Žåããã©ã¡ãŒã¿ãŒå€ã¯FreeMarkerãã¡ã€ã«ã§$ {Foo}ãšããŠå©çšã§ããŸãã
name-ãã©ã¡ãŒã¿ãŒã®è¡šç€ºåã
type-ãã©ã¡ãŒã¿ãŒã®ã¿ã€ãã 䜿çšå¯èœãªå€ã¯ãstringãbooleanãenumãããã³separatorã§ãã
å¶çŽ -ãªãã·ã§ã³ã ãã©ã¡ãŒã¿ã®å¶éã å¶çŽã¯ã|ã䜿çšããŠçµã¿åãããããšãã§ããŸãã
å¶çŽã®çš®é¡- 空ã§ã¯ãªã-å€ã¯ç©ºã§ãã£ãŠã¯ãªããªã
- apilevel-APIã¬ãã«ã瀺ããŸã
- ããã±ãŒãž-å€ã¯æå¹ãªJavaããã±ãŒãžåã§ãªããã°ãªããŸãã
- app_package-å€ã¯æå¹ãªAndroidã¢ããªããã±ãŒãžåã§ããå¿
èŠããããŸã
- module-å€ã¯æå¹ãªã¢ãžã¥ãŒã«åã§ãªããã°ãªããŸãã
- class-å€ã¯æå¹ãªJavaã¯ã©ã¹ã§ãªããã°ãªããŸãã
- activity-å€ã¯Activityã¯ã©ã¹ã®å®å
šä¿®é£Ÿåã§ãªããã°ãªããŸãã
- ã¬ã€ã¢ãŠã-å€ã¯æå¹ãªãªãœãŒã¹ã¬ã€ã¢ãŠãåã§ããå¿
èŠããããŸã
- drawable-å€ã¯æå¹ãªããã¢ãã«ãªãœãŒã¹åã§ãªããã°ãªããŸãã
- string-å€ã¯æå¹ãªãªãœãŒã¹æåååã§ãªããã°ãªããŸãã
- id-å€ã¯æå¹ãªIDåã§ãªããã°ãªããŸãã
- äžæ-å€ã¯äžæã§ããå¿
èŠããããŸã
- ååšãã-å€ãååšããå¿
èŠããããŸã
suggest-ãªãã·ã§ã³ã ä»ã®ãã©ã¡ãŒã¿ãŒã®å€ã«å¿ããŠãèªåçã«æŽæ°ãããåŒã
ããã©ã«ãã¯ãªãã·ã§ã³ã§ãã ãã®ãã©ã¡ãŒã¿ãŒã®ããã©ã«ãå€ã
å¯èŠæ§ -ãªãã·ã§ã³ã ã³ã³ããŒãã³ãã®å¯èŠæ§ãå®çŸ©ããFreeMarkeråŒã
ãã«ãã¯ãªãã·ã§ã³ã§ãã ãã®ãã©ã¡ãŒã¿ãŒã®ãã³ãã
ãªãã·ã§ã³èŠçŽ
åæåã®ãã©ã¡ãŒã¿ãŒã®å Žåããããã¯éžæããé
ç®ã§ãã
id-ãã®ãªãã·ã§ã³ãéžæãããŠããå Žåããã©ã¡ãŒã¿ãŒå€ãèšå®ãããŸãã
minApi-ãªãã·ã§ã³ã æäœéã®APIã¬ãã«ãå¿
èŠã§ãã
[text] -ãã®ãªãã·ã§ã³ãéžæããããšãã«è¡šç€ºãããããã¹ãã
芪æèŠçŽ
ãã³ãã¬ãŒãã®ãµã ãã€ã«ã衚瀺ããŸãã èŠçŽ ã¯èŠçŽ å
ã«ãªããã°ãªããŸããã ãã®èŠçŽ ã«å«ãŸããããã¹ãã¯ããµã ãã€ã«ãžã®ãã¹ã§ãã ãã®èŠçŽ ã«å±æ§ãããå Žåããããã¯ã»ã¬ã¯ã¿ãŒãšèŠãªãããŸãã
äŸïŒ
<thumbs> <thumb>template.png</thumb> <thumb navType="tabs">template_tabs.png</thumb> </thumbs>
navTypeã§ã¿ããéžæãããŠããå ŽåãTemplate_tabs.pngã¯ãµã ãã€ã«ãšããŠè¡šç€ºãããŸãã
globals.xml.ftl
XMLãã¡ã€ã«ã«ã¯ãFreeMarkeräœæ¥ã¬ã€ã¢ãŠãã§äœ¿çšããã°ããŒãã«å€æ°ãå«ãŸããŠããŸãã
äŸglobals.xml.ftlïŒ
<globals> <global id="srcOut" value="src/${slashedPackageName(packageName)}" /> <global id="activityNameLower" value="${activityName?lower_case}" /> <global id="activityClass" value="${activityName}Activity" /> </globals>
recipe.xml.ftl
ãã®XMLãã¡ã€ã«ã«ã¯ããã®ãã³ãã¬ãŒãã®ã³ãŒããçæããéã«åŸãå¿
èŠãããåå¥ã®æ瀺ãå«ãŸããŠããŸãã
ããšãã°ãããã€ãã®ãã¡ã€ã«ãŸãã¯ãã£ã¬ã¯ããªãã³ããŒãïŒã³ããŒåœä»€ïŒãFreeMarkerãä»ããŠãã¡ã€ã«ãäœæãïŒã€ã³ã¹ã¿ã³ã¹ååœä»€ïŒãIDEã«ãã¡ã€ã«ãéãããã«èŠæ±ã§ããŸãïŒãªãŒãã³åœä»€ïŒã
泚ïŒæ瀺ãã¡ã€ã«ã®ååã¯ãtemplate.xmlã§å®çŸ©ãããŠããŸãã ãã ããæ
£äŸã«ãããrecipe.xml.ftlãšåŒã¶ã®ãæåã§ãã
泚ïŒã°ããŒãã«å€æ°globals.xml.ftlã¯ãrecipe.xml.ftlã§äœ¿çšã§ããŸãã
Recipe.xml.ftlã®äŸ <recipe> <#if appCompat?has_content> <dependency mavenUrl="com.android.support:appcompat-v7:+"/> </#if> <merge from="AndroidManifest.xml.ftl" to="${escapeXmlAttribute(manifestDir)}/AndroidManifest.xml" /> <copy from="res/drawable-mdpi" to="${escapeXmlAttribute(resDir)}/res/drawable-mdpi" /> <copy from="res/drawable-hdpi" to="${escapeXmlAttribute(resDir)}/res/drawable-hdpi" /> <copy from="res/drawable-xhdpi" to="${escapeXmlAttribute(resDir)}/res/drawable-xhdpi" /> <copy from="res/drawable-xxhdpi" to="${escapeXmlAttribute(resDir)}/res/drawable-xxhdpi" /> <copy from="res/menu/main.xml" to="${escapeXmlAttribute(resDir)}/res/menu/${activityNameLower}.xml" /> <merge from="res/values/dimens.xml" to="${escapeXmlAttribute(resDir)}/res/values/dimens.xml" /> <merge from="res/values-large/dimens.xml" to="${escapeXmlAttribute(resDir)}/res/values-large/dimens.xml" /> <merge from="res/values/styles.xml" to="${escapeXmlAttribute(resDir)}/res/values/styles.xml" /> <merge from="res/values/strings.xml.ftl" to="${escapeXmlAttribute(resDir)}/res/values/strings.xml" /> <#if navType?contains("pager")> <instantiate from="${escapeXmlAttribute(resDir)}/res/layout/activity_pager.xml.ftl" to="${escapeXmlAttribute(resDir)}/res/layout/activity_${activityNameLower}.xml" /> <#elseif navType == "tabs" || navType == "dropdown"> <copy from="${escapeXmlAttribute(resDir)}/res/layout/activity_fragment_container.xml" to="${escapeXmlAttribute(resDir)}/res/layout/activity_${activityNameLower}.xml" /> <#else> <copy from="${escapeXmlAttribute(resDir)}/res/layout/activity_simple.xml" to="${escapeXmlAttribute(resDir)}/res/layout/activity_${activityNameLower}.xml" /> </#if> <#if navType == "none"> <instantiate from="src/app_package/SimpleActivity.java.ftl" to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" /> <#elseif navType == "pager"> <instantiate from="src/app_package/PagerActivity.java.ftl" to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" /> <#elseif navType == "tabs"> <instantiate from="src/app_package/TabsActivity.java.ftl" to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" /> <#elseif navType == "dropdown"> <instantiate from="src/app_package/DropdownActivity.java.ftl" to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" /> </#if> <open file="${escapeXmlAttribute(resDir)}/res/layout/${activityNameLower}.xml" /> <open file="${escapeXmlAttribute(srcOut)}/${activityClass}.java" /> </recipe>
æ瀺ã¯æ¬¡ã®æ¹æ³ããµããŒãããŸãã
äŸåé¢ä¿ãã³ãã¬ãŒãã«ã©ã€ãã©ãªãå¿
èŠã§ããããšã瀺ããŸãã ããã§ãªãå ŽåãIDEã¯ãããžã§ã¯ãã«äŸåé¢ä¿ãè¿œå ããŸãã
MavenUrlå±æ§
Mavenã©ã€ãã©ãªããã±ãŒãžã®æå®ã ããšãã°ãcom.android.supportïŒappcompat-v7ïŒ+
ã³ããŒå¯äžã®å¿
é ãã©ã¡ãŒã¿ãŒã¯ãã«ãŒã/ãã£ã¬ã¯ããªãåºæºã«ããŠã³ããŒãããœãŒã¹ãã¡ã€ã«ãžã®ãã¹ã§ãã å¿
èŠã«å¿ããŠãå¿
èŠãªãã¹ãŠã®ãµããã£ã¬ã¯ããªãèªåçã«äœæãããŸãã
ããã©ã«ãã®äœæãã£ã¬ã¯ããªã¯ã/ã«ãŒããã©ã«ããåºæºã«ãããã³ãã¬ãŒãã®å Žæãšåãã§ãã ãã¡ã€ã«äœæãã¹ãæå®ããããã®ãªãã·ã§ã³ã®ãã©ã¡ãŒã¿ãŒããããŸãã .ftlæ¡åŒµåã¯èªåçã«åé€ãããããšã«æ³šæããŠãã ããã ããšãã°ãentry>ã¯æ£ããã§ãã strings.xml.ftlã§ã¯ãªããstrings.xmlãšããååã®ãã¡ã€ã«ãäœæãããŸãã
ã€ã³ã¹ã¿ã³ã¹åããã³ããŒãšåãã§ããããœãŒã¹ãã¡ã€ã«ã®å ŽåãFreeMarkerãæåã«èµ·åãããŸãã
䜵åãããã®åœä»€ã¯ããœãŒã¹ãã¡ã€ã«ã®FreeMarkerãèµ·åããã³ã³ãã³ãããããžã§ã¯ãå
ã®æ¢åã®ãã¡ã€ã«ãšããŒãžããããæ°ãããã¡ã€ã«ãäœæããŸãã ãã®åœä»€ã®æãäžè¬çãªäœ¿çšäŸã¯ãAndroidManifest.xmlãã¡ã€ã«ã«ã³ã³ããŒãã³ããè¿œå ããããstrings.xmlãªã©ã®ãªãœãŒã¹ãçµã¿åãããããšã§ãã
éãã³ãŒãçæã®å®äºåŸã«ãåŒæ°ã§æå®ããããã¡ã€ã«ãéããŸãã
mkdiråŒæ°ã§æå®ããããã£ã¬ã¯ããªã®ååšã確èªããŸã
ã«ãŒã/
ãã¹ãŠã®ãã³ãã¬ãŒããã¡ã€ã«ïŒãªãœãŒã¹ãJavaãœãŒã¹ãAndroidãããã§ã¹ãïŒã¯ã«ãŒã/ãã£ã¬ã¯ããªã«é
眮ããå¿
èŠããããŸã
ãã ãããœãŒã¹ãã¡ã€ã«ãsrc / com / google /ã«é
眮ãã代ããã«ãåã«src / app_package /ã䜿çšã§ããŸãã
çµã¿èŸŒã¿ãã³ãã¬ãŒãé¢æ°
䜿çšã§ããFreeMarkeré¢æ°ã®ãªã¹ãã«å«ãŸããŠããªãé¢æ°ãããã€ããããŸãã
ãããã®ããã€ãã次ã«ç€ºããŸãã
æååactivityToLayoutïŒæååïŒActivityã¯ã©ã¹åãããªãœãŒã¹åãšããŠäœ¿çšããã®ã«é©ããæååã«å€æããŸãã ããšãã°ãFooActivityã¯activity_fooã«å€æãããŸãã
æååcamelCaseToUnderscoreïŒæååïŒãã£ã¡ã«ã±ãŒã¹æååãäžç·æååã«å€æããŸãã ããšãã°ãFooBarã¯foo_barã«å€æãããŸãã
æååclassToResourceïŒæååïŒFooActivityãFooFragmentãªã©ã®Androidã¯ã©ã¹åããæ¥å°ŸèŸãActivityããŸãã¯ãFragmentããæã€å¯Ÿå¿ãããªãœãŒã¹ã«å€æããŸãã
çŸåšèªèãããŠãããã®ïŒ
- ã¢ã¯ãã£ããã£
- ãã©ã°ã¡ã³ã
- ãããã€ããŒ
- ãµãŒãã¹
æåålayoutToActivityïŒæååïŒæ¥å°ŸèŸãæã€ãªãœãŒã¹ãã¯ã©ã¹æååã«å€æããŸãã ããšãã°ãactivity_fooã¯Javaã¯ã©ã¹FooActivityã«å€æãããŸãã
æååslashedPackageNameïŒæååïŒå®å
šä¿®é£ŸJavaããã±ãŒãžåã察å¿ãããã£ã¬ã¯ããªãã¹ã«å€æããŸãã ããšãã°ãæå®ãããåŒæ°ãcom.example.fooã®å Žåãæ»ãå€ã¯com / example / fooã«ãªããŸãã
æååunderscoreToCamelCaseïŒæååïŒè¡ã®ã¢ã³ããŒã¹ã³ã¢ã察å¿ãããã£ã¡ã«ã±ãŒã¹è¡ã«å€æããŸãã ããšãã°ãfoo_barããFooBarãžã
çµã¿èŸŒã¿ãã³ãã¬ãŒããã©ã¡ãŒã¿
FreeMarkerã®åŒãšãã¡ã€ã«ã§å©çšå¯èœãªãªãã·ã§ã³ã
packageNameãããžã§ã¯ãããã±ãŒãžåïŒcom.example.fooãªã©ïŒ
isNewProjectãã³ãã¬ãŒããæ°ãããããžã§ã¯ããã³ãã¬ãŒããã©ããã瀺ãããŒã«å€ã
manifestDirAndroidManifest.xmlãå«ããã£ã¬ã¯ããªã
srcDirãããžã§ã¯ãã®JavaãœãŒã¹ãã¡ã€ã«ãã£ã¬ã¯ããªã
resDirãããžã§ã¯ãã®ãªãœãŒã¹ã«ãŒããã£ã¬ã¯ããªïŒres /ïŒã®ãã£ã¬ã¯ããªã
é¢æ°ãšãã©ã¡ãŒã¿ãŒã®å®å
šãªãªã¹ãã«ã€ããŠã¯ã
ããã¥ã¡ã³ããåç
§ããŠãã ããã
äžè¬ã«ãç¬èªã®ãã³ãã¬ãŒããäœæããããšã¯é£ãããããŸããã äœæã«å°ãæéãè²»ãããåŸããããžã§ã¯ãã§ã³ã³ããŒãã³ããšæ§é ãäœæããã«ãŒãã³ãåãé€ãããšãã§ããŸãã
èªååã§ãããã¹ãŠã®ãã®ã䜿çšããŠèªååããŸãã
䟿å©ãªãªã³ã¯
ããã¥ã¡ã³ãGoogleã¢ããªãã£ã¯ã¹ã®ç¬èªã®ã¢ã¯ãã£ããã£ã®äœæã«é¢ããèšäºFreeMarkerã䜿çšãã