Help us understand the problem. What is going on with this article?

Android Studioでの開発を爆速化させるテンプレート作成術 〜テンプレートのしくみ〜

More than 3 years have passed since last update.

はじめに

Android Studioを使ってAndroidアプリを開発する場合、プロジェクトごとに毎回毎回同じような設定やコードを書いていて無駄な時間を使っていると感じることはないでしょうか?

Templateを使うことで、こんな無駄な作業を省略することができます。

今回は、既存のTemplateの中身を見てTemplateのしくみを調べていきます。

Templateのしくみ

Templateの構成

Macの場合、下記ディレクトリにTemplateが配置されています。

 /Applications/Android Studio.app/Contents/plugins/android/lib/templates/

空のFragmentを作る下記Templateを参考に作成していきます。
/Applications/Android Studio.app/Contents/plugins/android/lib/templates/other/BlankFragment/

このBlankFragmentには、下記のファイルが入っています。

├── globals.xml.ftl
├── recipe.xml.ftl
├── root
│   ├── res
│   │   ├── layout
│   │   │   └── fragment_blank.xml.ftl
│   │   └── values
│   │       └── strings.xml
│   └── src
│       └── app_package
│           └── BlankFragment.java.ftl
├── template.xml
└── template_blank_fragment.png

template.xml

templateの大本になるファイルは、template.xmlです。
下記のようにtemplateの名前や説明、templateのカテゴリ、サムネイルの画像ファイル名を記述します。

template.xml
<template
    format="5"
    revision="3"
    name="Fragment (Blank)"
    description="Creates a blank fragment that is compatible back to API level 4."
    minApi="7"
    minBuildApi="8">

    <!-- この記述によりFragment (Blank)がFragmentのカテゴリに表示されるようになる -->
    <category value="Fragment" />

    ...

    <thumbs>
        <thumb>template_blank_fragment.png</thumb>
    </thumbs>

    <globals file="globals.xml.ftl" />
    <execute file="recipe.xml.ftl" />

</template>

プロジェクトに配置するファイルの元ファイル

プロジェクトに配置されるファイルは、root/res/layout/fragment_blank.xml.ftl、root/res/layout/value/strings.xml、src/app_package/BlankFragment.java.ftlです。
この*.ftlファイル内には、下記のように変数が記述されており変数に値を埋め込むことでファイルの作成を行います。

BlankFragment.java.ftl
 package ${packageName};

<#if includeCallbacks>import android.content.Context;</#if>
<#if includeCallbacks>import android.net.Uri;</#if>
import android.os.Bundle;
import android${SupportPackage}.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
<#if !includeLayout>import android.widget.TextView;</#if>
<#if applicationPackage??>
import ${applicationPackage}.R;
</#if>

...

public class ${className} extends Fragment {
    ...
}

この変数は、template.xmlで定義されています。
template.xmlで定義された変数は、Fragment作成時のウィザードで編集できるようになっています。

template.xml
    ...
    <parameter
        id="className"
        name="Fragment Name"
        type="string"
        constraints="class|nonempty|unique"
        default="BlankFragment"
        help="The name of the fragment class to create" />
    ...

例えば、Fragmentのクラス名のclassNameはこのように定義されていており、Fragment作成時のウィザードでは、下記のように入力を受け付けられるようになっています。

wizard

recipe.xml.ftlは、src/app_package/BlankFragment.java.ftl等の元になるファイルをプロジェクト内に配置するための記述を行うファイルです。

recipe.xml.ftl

recipe.xml.ftl
<?xml version="1.0"?>
<recipe>

    <#if useSupport><dependency mavenUrl="com.android.support:support-v4:${buildApi}.+"/></#if>
    <merge from="root/res/values/strings.xml" to="${escapeXmlAttribute(resOut)}/values/strings.xml" />

    <#if includeLayout>
        <instantiate from="root/res/layout/fragment_blank.xml.ftl"
                       to="${escapeXmlAttribute(resOut)}/layout/${escapeXmlAttribute(fragmentName)}.xml" />

        <open file="${escapeXmlAttribute(resOut)}/layout/${escapeXmlAttribute(fragmentName)}.xml" />
    </#if>

    <open file="${escapeXmlAttribute(srcOut)}/${className}.java" />

    <instantiate from="root/src/app_package/BlankFragment.java.ftl"
                   to="${escapeXmlAttribute(srcOut)}/${className}.java" />

</recipe>

このファイルでtemplateのディレクトリにある*.ftlファイルをプロジェクトのどの位置に配置するのかを記述しています。
プロジェクトの配置位置を示すsrcOutやresOutは、globals.xml.ftlに定義されています。
このファイル内に書いてあるキーワードは、それぞれ下記の意味になります。

キーワード 意味
dependency build.gradleに追加する依存ライブラリ
instance 新規にファイルを作成する
merge ファイルをマージする(xmlとgradleのみに対応)
open ファイル作成後、Android Studioでファイルを開く

まとめ

以上が、Android Studioのtemplateの大まかなしくみになります。
これらの要素を使用して毎回作成しているファイル郡をtemplateにしておくことで、作業時間の短縮が可能になります。

次回は、今回説明した要素を使ってみてAdsenseのバナーを画面下部に表示するFragmentを作成してみます。
Android Studioでの開発を爆速化させるテンプレート作成術 〜Adsenseのバナーを画面下部に表示するFragment〜

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away