2012年12月10日月曜日

[Android] テンプレートを作成する(Object編)

今までProjectActivityとテンプレートを作成してきました。最後にObjectのテンプレートを作成します。

Objectといっても広すぎるので、Fragmentを生成するテンプレートにします。

Objectのテンプレートは
[SDK_ROOT]/tools/templates/other配下にあります。

ここにFragmentという名前のテンプレートを作成します。
(なんでよく使うFragmentのテンプレートが最初から無いんだろう(^_^;))

templates配下のフォルダ構成です。


template.xml
<?xml version="1.0"?>
<template
    format="1"
    revision="1"
    name="New Fragment"
    description="Creates a new fragment class">
    <dependency name="android-support-v4" revision="8" />

    <parameter
        id="className"
        name="Class Name"
        type="string"
        constraints="class|unique|nonempty"
        default="MyFragment" />

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

</template>

今回はFragmentなのでSupport Libraryをインポートします。

recipe.xml.ftl
<?xml version="1.0"?>
<recipe>
    <instantiate from="src/app_package/Fragment.java.ftl"
                   to="${srcOut}/${className}.java" />
</recipe>
globals.xml.ftl
<?xml version="1.0"?>
<globals>
    <global id="srcOut" value="src/${slashedPackageName(packageName)}" />
</globals>
Fragment.java.ftl
package ${packageName};

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ${className} extends Fragment {

    @Override
    public void onAttach(Activity activity) {
        // TODO 自動生成されたメソッド・スタブ
        super.onAttach(activity);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO 自動生成されたメソッド・スタブ
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // TODO 自動生成されたメソッド・スタブ
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO 自動生成されたメソッド・スタブ
        super.onActivityCreated(savedInstanceState);
    }

    @Override
    public void onStart() {
        // TODO 自動生成されたメソッド・スタブ
        super.onStart();
    }

    @Override
    public void onResume() {
        // TODO 自動生成されたメソッド・スタブ
        super.onResume();
    }

    @Override
    public void onPause() {
        // TODO 自動生成されたメソッド・スタブ
        super.onPause();
    }

    @Override
    public void onStop() {
        // TODO 自動生成されたメソッド・スタブ
        super.onStop();
    }

    @Override
    public void onDestroyView() {
        // TODO 自動生成されたメソッド・スタブ
        super.onDestroyView();
    }

    @Override
    public void onDestroy() {
        // TODO 自動生成されたメソッド・スタブ
        super.onDestroy();
    }

    @Override
    public void onDetach() {
        // TODO 自動生成されたメソッド・スタブ
        super.onDetach();
    }

}
空のFragmentを生成します。FragmentのライフサイクルはActivityより多くてよく忘れるのでライフサイクル順にOverrrideさせてます。

手抜きですがこれで完成です。(手の込んだやつは追々...)
あとはActivityと同様にEclipseから以下の手順で追加できます。
[ファイル]→[新規]→[その他]→[Android]→[Android オブジェクト]

Create Android ObjectでFragmentを選択し、Class Nameを入力したら完了です。


これでFragmentを生成することができました。

一応作成したのを置いておきます。Fragment.zip

これで一通りのテンプレート作成は終了です。Projectのテンプレートは現在1つしか作れないため最小構成になると思いますが、ActivityとFragmentは実際に使う場合、標準のLoginActivityなどのように用途に合わせて作成するとより便利になります。

...といっても個人で作るのは限界があるので、Googleか誰かがテンプレートの共有サイト(システム)を作ってくれないかなぁ...と[壁]_・)チラッ

2012年11月24日土曜日

[Android] テンプレートを作成する(Activity編)

前回はプロジェクト作成時のテンプレートを作成しました。今回はActivityのテンプレートを作成します。

Activtyのテンプレートは
[SDK_ROOT]/tools/templates/activities配下にあります。

ここに空のListActivity(Activity+ListView)を作成するBlankListActivityというテンプレートを作成したいと思います。 基本的にBlanktActivityのテンプレートを元に作成します。

templates配下のフォルダ構成です。


template.xml
<?xml version="1.0"?>
<template
    format="3"
    revision="2"
    name="New Blank List Activity"
    description="Creates a new blank list activity.">

    <category value="Activities" />

    <parameter
        id="activityClass"
        name="Activity Name"
        type="string"
        constraints="class|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="activityTitle"
        name="Title"
        type="string"
        constraints="nonempty"
        default="MainActivity"
        suggest="${activityClass}"
        help="The name of the activity. For launcher activities, the application title." />

    <parameter
        id="isLauncher"
        name="Launcher Activity"
        type="boolean"
        default="false"
        help="If true, this activity will have a CATEGORY_LAUNCHER intent filter, making it visible in the launcher" />

    <parameter
        id="parentActivityClass"
        name="Hierarchical Parent"
        type="string"
        constraints="activity|exists|empty"
        default=""
        help="The hierarchical parent activity, used to provide a default implementation for the 'Up' button" />

    <parameter
        id="navType"
        name="Navigation Type"
        type="enum"
        default="none"
        help="The type of navigation to use for the activity" >
        <option id="none" default="true">None</option>
    </parameter>

    <parameter
        id="packageName"
        name="Package name"
        type="string"
        constraints="package"
        default="com.mycompany.myapp" />

    <!-- 128x128 thumbnails relative to template.xml -->
    <thumbs>
        <!-- default thumbnail is required -->
        <thumb>template_blank_activity.png</thumb>
        <!-- attributes act as selectors based on chosen parameters -->
        <thumb navType="none">template_blank_activity.png</thumb>
    </thumbs>

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

</template>

73行目でテンプレートのサムネイル画像を指定してますが、画像がないのでBlanktActivityのを使ってます(^_^;)

recipe.xml.ftl
<?xml version="1.0"?>
<recipe>
    <merge from="AndroidManifest.xml.ftl" />

    <merge from="res/values/strings.xml.ftl" />

    <instantiate from="res/layout/activity_simple.xml.ftl"
                   to="res/layout/${layoutName}.xml" />

    <instantiate from="src/app_package/SimpleListActivity.java.ftl"
                   to="${srcOut}/${activityClass}.java" />

</recipe>

globals.xml.ftl
<?xml version="1.0"?>
<globals>
    <global id="srcOut" value="src/${slashedPackageName(packageName)}" />
</globals>

AndroidManifest.xml.ftl
<manifest xmlns:android="http://schemas.android.com/apk/res/android" >

    <application>
        <activity android:name=".${activityClass}"
            <#if isNewProject>
            android:label="@string/app_name"
            <#else>
            android:label="@string/title_${activityToLayout(activityClass)}"
            </#if>
            <#if isLauncher>
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            </#if>
        </activity>
    </application>

</manifest>

ここまではBlankActivityのテンプレートをほぼそのまま使用してます。

strings.xml.ftl
<resources>
    <#if !isNewProject>
    <string name="title_${activityToLayout(activityClass)}">${escapeXmlString(activityTitle)}</string>
    </#if>

    <string name="text_empty">List is empty</string>

</resources>

activity_simple.xml.ftl
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".${activityClass}"
    android:orientation="vertical"
    android:layout_width=<#if buildApi lt 8 >"fill_parent"<#else>"match_parent"</#if>
    android:layout_height=<#if buildApi lt 8 >"fill_parent"<#else>"match_parent"</#if> >

    <ListView
        android:id="@android:id/list"
        android:layout_width=<#if buildApi lt 8 >"fill_parent"<#else>"match_parent"</#if>
        android:layout_height=<#if buildApi lt 8 >"fill_parent"<#else>"match_parent"</#if> >
    </ListView>

    <TextView
        android:id="@android:id/empty"
        android:layout_width=<#if buildApi lt 8 >"fill_parent"<#else>"match_parent"</#if>
        android:layout_height=<#if buildApi lt 8 >"fill_parent"<#else>"match_parent"</#if>
        android:gravity="center"
        android:text="@string/text_empty"
        android:textAppearance="?android:attr/textAppearanceLarge" >
    </TextView>

</LinearLayout>

ListViewのレイアウトです。ビルドAPIが8未満ではfill_parentを使うようにしてます。

SimpleListActivity.java.ftl
package ${packageName};

import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.app.Activity;

public class ${activityClass} extends Activity implements OnItemClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.${layoutName});

        ListView listView = (ListView) findViewById(android.R.id.list);
        listView.setEmptyView(findViewById(android.R.id.empty));
        listView.setAdapter(null);
        listView.setOnItemClickListener(this);
        listView.setOnCreateContextMenuListener(this);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // TODO 自動生成されたメソッド・スタブ
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        // TODO 自動生成されたメソッド・スタブ
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        // TODO 自動生成されたメソッド・スタブ
        return super.onContextItemSelected(item);
    }

}

ListViewを表示するActivityです。最低限必要なのだけ書いてます。

これでテンプレートは完成です。あとはEclipseから追加します。
プロジェクト作成時でも追加できますが、以下の手順で後からでも追加できます。
[ファイル]→[新規]→[その他]→[Android]→[Android アクティビティー]

アクティビティーの作成でBlankListActivityを選択し、Activity Nameなどを入力したら完了です。


これでListActivityが追加できるようになりました。

今回作成したのを置いておきます。BlankListActivity.zip

次回はその他のObjectのテンプレートを作成します。

2012年11月22日木曜日

[Android] テンプレートを作成する(プロジェクト編)

ADT 20.0.0から追加されたテンプレート機能ですが、オリジナルのテンプレートを作成することができます。

プロジェクトのテンプレートは[SDK_ROOT]/tools/templates/projects/NewAndroidApplication/配下にあります。

まず、テンプレートを変更・追加をする前に、templatesフォルダをどこかにコピーしておいてください。SDK・ADTがバージョンアップすると書き換えられる可能性があります。(ADT21.0.0にしたら書き換えられた(´;ω;`))


デフォルトのテンプレートだと以下のような構成です。


私の場合、サポートライブラリなどはあまり使わないため、以下のファイルを編集します。

template.xml
<?xml version="1.0"?>
<template
    format="1"
    revision="1"
    name="New Android Application"
    description="Creates a new Android application with an activity.">
<!--
    <dependency name="android-support-v4" revision="8" />
-->

    <thumbs>
        <thumb>template_new_project.png</thumb>
    </thumbs>

    <category value="Applications" />

    <parameter
        id="packageName"
        name="Package name"
        type="string"
        constraints="package"
        default="com.mycompany.myapp" />

    <parameter
        id="appTitle"
        name="Application title"
        type="string"
        constraints="nonempty"
        default="My Application" />

    <parameter
        id="minApi"
        name="Minimum API level"
        type="string"
        constraints="apilevel"
        default="7" />

    <!--
      Usually the same as minApi, but when minApi is a code name this will be the corresponding
      API level
    -->
    <parameter
        id="minApiLevel"
        name="Minimum API level"
        type="string"
        constraints="apilevel"
        default="7" />

    <parameter
        id="targetApi"
        name="Target API level"
        type="string"
        constraints="apilevel"
        default="15" />

    <parameter
        id="buildApi"
        name="Build API level"
        type="string"
        constraints="apilevel"
        default="15" />

    <parameter
        id="copyIcons"
        name="Include launcher icons"
        type="boolean"
        default="true" />

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

</template>


8行目をコメントアウトしてサポートライブラリを追加しないようにしました。

※minApiLevelとかのdefaultを変更したらプロジェクト作成時の初期値が変わるかと思ったけど何も変わらない。。。

recipe.xml.ftl
<?xml version="1.0"?>
<recipe>
    <instantiate from="AndroidManifest.xml.ftl" />

<#if copyIcons>
    <copy from="res/drawable" />
    <copy from="res/drawable-hdpi" />
    <copy from="res/drawable-mdpi" />
    <copy from="res/drawable-xhdpi" />
</#if>
    <copy from="res/values/styles.xml" />
<#if buildApi gte 11>
    <copy from="res/values-v11/styles.xml" />
</#if>
<#if buildApi gte 14>
    <copy from="res/values-v14/styles.xml" />
</#if>

    <instantiate from="res/values/strings.xml.ftl" />
</recipe>


6行目にdrawableフォルダをコピーする処理を追加しました。
デフォルトではdrawableフォルダが無いのでtemplates/projects/NewAndroidApplication/root/res/にフォルダを作成し、適当な画像やxmlなどを置きます。




最後にデフォルトではdrawable-hdpiフォルダなどにic_action_search.pngがありますが、普段は使わないので削除します。

これでプロジェクトを作成すると以下のような構成になります。



次回はActivityのテンプレートを作成したいと思います。

2012年11月21日水曜日

ブログはじめました

lilylightと申します。

社会人というものになってから3年以上経ちまして、昔やったこと覚えてないなぁってのを最近痛感してきたので、覚え書きとしてブログでもやってみようかと。

主に技術的なことを書いていきたいと思いますので、よろしくお願いします<(_ _)>