Android IDEテンプレヌト圢匏



新しいアプリケヌションを䜜成するプロセスでは、同じタむプのコヌドを蚘述し、時間ですでにテストされたクラス構造を再珟する必芁が非垞に頻繁にありたす。 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の䟋
<!--    Activity.     format=4,     . --> <template format="4" revision="2" minApi="7" minBuildApi="16" name="Blank Activity" description="Creates a new blank activity, with navigation."> <!--  ;    FreeMarker    (.ftl files)  ${activityName}. --> <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" /> <!-- 512x512 PNG . --> <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" /> <!--   ,   FreeMarker --> <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" /> <!--  FreeMarker  merge     --> <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> <!--  Activity  --> <#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> <!--    Java class   --> <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

テンプレヌトが新しいプロゞェクトテンプレヌトかどうかを瀺すブヌル倀。



manifestDir

AndroidManifest.xmlを含むディレクトリ。



srcDir

プロゞェクトのJava゜ヌスファむルディレクトリ。



resDir

プロゞェクトのリ゜ヌスルヌトディレクトリres /のディレクトリ。



関数ずパラメヌタヌの完党なリストに぀いおは、 ドキュメントを参照しおください。



䞀般に、独自のテンプレヌトを䜜成するこずは難しくありたせん。 䜜成に少し時間を費やした埌、プロゞェクトでコンポヌネントず構造を䜜成するルヌチンを取り陀くこずができたす。

自動化できるすべおのものを䜿甚しお自動化したす。



䟿利なリンク



ドキュメント

Googleアナリティクスの独自のアクティビティの䜜成に関する蚘事

FreeMarkerを䜿甚する



All Articles