Hello, World

Android1.0の記事から多少内容が変わっていました。大きく違うのは、strings.xmlファイルでAndroidに表示する文字列を定義するところかな。

原文:http://developer.android.com/guide/tutorials/hello-world.html

                                                                                                              • -

開発者が初めてAndroidで”Hello World!”を書いたとしたら、とても簡単だという印象を受けるはずです。実際、本当に簡単なのです。IDEEclipseを使えばさらに簡単です。プロジェクトの作成や管理を行う強力なプラグインを提供しているため、開発スピードが格段に速くなるはずです。

Eclipseを使っていない場合でも、大丈夫です。「その他のIDEでの開発」を読んだ後、この章に戻ってきてEclipseについてのすべての記述を無視すれば良いのです。

以降を始める前に、まずは最新のSDKがインストールしてください。もしEclipseを使用するなら、ADTプラグインもインストールしてください。インストール方法は「Android SDKのインストール」を参照してください。


以降に表示されているスクリーンショットを大きくしたい場合には、画像をクリックしてください。

プロジェクトを作成する

1. 新規Androidプロジェクトを開く

Eclipseメニューの ファイル > 新規 > プロジェクトを選択します。EclipseAndroidプラグインのインストールが成功していれば、結果ダイアログの”Android”フォルダを開くと”Androidプロジェクト”が含まれています。

Androidプロジェクト”を選択して、次へを押してください。


2. プロジェクト詳細を入力する

次の画面では、プロジェクトの詳細情報を入力します。

  • プロジェクト名: HelloAndroid
  • パッケージ名: com.example.hello (任意のネームスペースでも良い)
  • アクティビティ名: HelloAndroid
  • アプリケーション名: Hello, Android

完了をクリックしてください。


画面項目の説明です。

プロジェクト名 プロジェクトを格納するディレクトリやフォルダ名
パッケージ名 ソースコードを格納するパッケージのネームスペース(Java言語と同様のパッケージルールに従います)。設定したパッケージの下にアクティビティのスタブが生成されます。アプリケーションで使用するパッケージ名はシステムにインストールされた全パッケージを通してユニークでなければなりません。アプリケーションに対して標準的なドメイン形式のパッケージを設定することが非常に重要です。上記の例では、ドメイン”com.android”パッケージを使用していますが、あなたの組織に合ったもの使用してください。
アクティビティ名 プラグインによって生成されるスタブクラスの名前です。Androidのアクティビティクラスのサブクラスになります。アクティビティは、それ自体で実行して何らかの処理をする単純なクラスです。アクティビティはUIを作成することもできますが、必須ではありません。
アプリケーション名 ユーザに対して表示されるアプリケーション名です。

3. 自動生成されたソースコードを開く
プラグインがプロジェクトを作成すると、以下のようなHelloAndroidという名前のクラスが作成されます(クラスは入力したパッケージ内のHelloAndroid > src > com.android.helloにあります)。

package com.example.hello;

import android.app.Activity;
import android.os.Bundle;

public class HelloAndroid extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}


では、ソースコードを修正しましょう。

UIを構築する
下記の修正されたコードを見て、同じようにHelloAndroid.javaファイルを変更してください。ソースコードに関しては、1行ずつ詳細に解説していきます。

package com.android.hello;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class HelloAndroid extends Activity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       TextView tv = new TextView(this);
       tv.setText("Hello, Android");
       setContentView(tv);
   }
}


TextViewパッケージのインポートを忘れてしまった場合には、Ctrl-Shift-OMacの場合はCmd-Shift-O)を実行してみてください。このコマンドはimport部分を編成するEclipseのショートカットで、インポートせずにパッケージを宣言した場合に自動的に追加してくれます。

Activityクラスを継承した上記のソースコードを見てみましょう。アクティビティとは、アクションを実行するための唯一のアプリケーションエンティティです。アプリケーションはたくさんのアクティビティを保持しますが、ユーザとやりとりできるのは一度に1つだけです。実際には、アクティビティが必ずユーザインターフェースを持たなければならないという訳ではありませんが、持っている場合がほとんどです。

Androidでは、ユーザインターフェースはView(ビュー)と呼ばれるクラス階層で構成されています。Viewはラジオボタンやアニメーション、テキストラベルのようなシンプルな描画オブジェクトです。ここで使われているTextViewはテキストを扱う特殊なViewのことです。

TextViewを生成しているのが以下のコードです。

TextView tv = new TextView(this);


TextViewのコンストラクタ変数は、Android Contextのインスタンスです。Contextは単にシステムのハンドルであり、リソースの解決や、データベースや設定情報へのアクセスの取得などのサービスを提供します。ActivityクラスはContextからの派生クラスです。つまりHelloAndroidクラスはActivityのサブクラスであり、またContextのサブクラスでもあるということになります。そのため、TextViewに対して”this”参照を渡すことができます。

TextViewを生成したら、次に何を表示するかを設定します。

tv.setText("Hello, Android");


特に特筆すべきことはないでしょう。

ここまでで、TextViewの生成と表示するテキストの設定が完了しました。最後に、以下のようにTextViewと画面の関連付けを行います。

setContentView(tv);


ActivityのsetContentView()メソッドは、どのViewがActivityのUIと関連付いているかをシステムに通知します。Activityがこのメソッドを呼びださなければUIは表示されず、真っ黒な画面が表示されます。とりあえず今はテキストを表示したいだけなので、さきほど作成したTextViewを渡しています。

以上でAndroid版”Hello World”が完成しました!次のステップで、実行してみましょう。

”Hello Android!”を実行する
Eclipseプラグインを使えば、アプリケーションの実行が非常に簡単になります。メニューから実行 > 実行ダイアログを開くを選択してください(Eclipse 3.4の場合は、実行 > 実行構成です)。以下のようなダイアログが表示されるはずです。


次に、”Androidアプリケーション”を選択して、左上端のアイコンをクリックするか(端に+マークがある1枚のシートのようなアイコン)、”Androidアプリケーション”をダブルクリックしてください。”新規構成”という名前の新規ランチャーが表示されるはずです。


名前を“Hello, Android”のように何か意味を持った名前に変更し、プロジェクトの参照ボタンをクリックしてプロジェクトを選択してください(Eclipse上で複数のAndroidプロジェクトが存在する場合には、適切なものを選択してください)。プラグインは選択されたプロジェクトにあるActivityサブクラスを自動的に検索し、アクティビティラベルにあるドロップダウンリストに追加します。”Hello, Android”プロジェクトに1つしかアクティビティを持たない場合には、デフォルトアクティビティを選択して次に進んでください。

“適用”ボタンをクリックします。以下に例を示します。


実行を押して、Androidエミュレータを起動し、アプリケーションを実行しましょう。起動後、アプリケーションが表示されるはずです(起動後、MENUキーを押してエミュレータの電話のロックを解除する必要があります)。ここまでの手順を全て完了できていれば、以下のような画面が表示されるはずです。


これで、Android版”Hello, World”は終わりです。すごく簡単だったでしょう?チュートリアルの次のセクションでは、より詳細で有益なAndroid情報を提供していきます。

XMLレイアウトへのUIのアップグレード
完成した“Hello World”の例では、”programmatic”と呼ばれるUIレイアウトを使用しており、ソースコード上で直接アプリケーションのUIを作成しビルドしています。多くのUIプログラミングを経験している方であれば、このやり方がいかに脆弱かをご理解いただけることでしょう。レイアウトを少し変更するだけで、やっかいな問題を引き起こす可能性があります。また、View同士の関連を忘れていまい、レイアウトエラーを引き起こしがちです。その結果、コードをデバッグするのに無駄な時間を浪費することになります。
このため、Androidは代わりとなるUI構築のモデルを提供しています。XMLベースのレイアウトファイルです。例とともに、このコンセプトを説明します。以下は、さきほど完成したプログラムと全く同じ振る舞いをするXMLレイアウトです。



AndroidXMLファイルはシンプルな構造になっています。ツリー構造のタグがあり、各タグ名はViewクラスです(この例では、エレメントが1つだけですが)。XMLレイアウトのタグ名には、自作のViewクラスのようにViewクラスを継承したクラスであればなんでも使用することができます。ソースコード上でやるよりずっと簡単に構造や構文を定義できるので、UIを速く簡単に組み立てることができます。このモデルは、アプリケーションのプレゼンテーション(UI)とデータの登録・検索を行うアプリケーションロジックを分離するというWeb開発モデルからヒントを得ています。

上記の例では、4つの属性を持つ1つのViewエレメント、TextViewがあります。以下にそれぞれの概要を記述します。

属性 意味
xmlns:android XML名前空間の定義です。Android名前空間で定義された共通属性を参照するということをAndroidツールに対して通知します。レイアウトファイルの一番外側には、この属性を含めなければなりません。
android:layout_width Viewが使用する画面の幅を定義します。今回のケースではViewは1つなので、”fill_parent”を設定して画面最大幅を使用しています。
android:layout_height android:layout_width”と同様に、使用する画面の高さを定義します。
android:text TextViewが表示するテキストを設定します。今回の例では、文字列をハードコードする代わりに文字列リソースを使用しています。string変数helloは、res/values/strings.xmlファイルで定義されています。アプリケーションに文字列を挿入したい場合には、この方法を推奨しています。アプリケーションを他の言語に簡単にローカライズできるからです。レイアウトファイルへ変更情報をハードコードする必要がないのです。詳細は、「リソースと国際化」を参照してください。

このレイアウトは、プロジェクトの/res/layout/の下にあります。”res”は”resources”の短縮形で、アプリケーションが必要とするソースコード以外の全てのリソース(画像、ローカライズ文字列、XMLファイルなど)を保持します。

Eclipseプラグインはプロジェクト作成時に自動的にXMLファイル(main.xml)を1つ生成してくれます。以前の例ではこのファイルを使わず、プログラム上でレイアウトを作成しました。フレームワークについての理解を深めてもらうためにそうしましたが、通常はソースコード上に記述する代わりに、XMLファイルでレイアウトを定義してください。

では、XMLレイアウトを使って”Hello, Android”サンプルを変更してみましょう。

1. Eclipseパッケージエクスプローラで、res/layout/フォルダを開き、main.xmlファイルを開いてください(開いた後、XMLソースを見るためには、下のほうにある”main.xml”タブをクリックする必要があるかもしれません)。main.xmlを以下のXMLに置き換えてください。



ファイルを保存してください。

2. プロジェクトのres/values/フォルダにあるstrings.xmlを開いてください。ユーザインターフェース用のデフォルト文字列を保存するフォルダです。Eclipseを使用しているのであれば、ADTがhelloとapp_nameの2つの文字列を作ってくれているはずです。では、helloを何か他のものに変更してください。”Hello, Android! I am a string resource”でもいいでしょう。ファイル全体は以下のようになります。


    Hello, Android! I am a string resource!
    Hello, Android


3. 最後にHelloAndroidのソースコードを修正し、UIをハードコードしている状態からXMLを使うようにします。以下は、変更後のクラスです。

package com.example.hello;

import android.app.Activity;
import android.os.Bundle;

public class HelloAndroid extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}


ソースコードを修正する際には単にコピーアンドペーストせず、Rクラスのコード補完機能を試してみてください。かなり役に立つ機能だということがわかります。

setContentViewにViewオブジェクトを渡す代わりに、レイアウトのリソースの参照を渡しています。リソースはR.layout.mainとして定義されています。これは実際には、layout/main.xmlで定義されたレイアウトをコンパイルしたオブジェクトです。Eclipseプラグインは自動的にプロジェクトのR.javaクラス内にこのレイアウトの参照を作成します。Eclipseプラグインを使っていない場合は、Antでアプリケーションをビルドする際に、R.javaクラスを生成するようにしてください(詳細は以下のRクラスを参照)。

修正が完了したら、アプリケーションを再起動してみましょう。緑の実行(Run)矢印アイコンをクリックするだけです。もしくは、メニューの実行 > ヒストリーの実行 > Hello, Androidからでも実行できます。以前と全く同じものが表示されるはずです。異なる2つのやり方でレイアウトを作成しましたが、最終的には同じ結果になりました。


Ctrl-Shift-F11(Macの場合は、Cmd-Shift-F11)のショートカットを使うと、現在表示されているアプリケーションを実行します。

あなたにとって初めてのAndroidアプリケーションが完成しました!デバッグや他のIDEの使用に関しては、続きを読んでください。先へ進める準備が出来たら、「アプリケーションの基礎」を参照してみてください。また、「デベロッパーズガイド」も併せて参照してみてください。


Rクラス

EclipseのパッケージエクスプローラーのソースコードフォルダからR.javaを開いてみてください。以下のようなものが表示されるはずです。

public final class R {
    public static final class attr {
    }
    public static final class drawable {
        public static final int icon=0x7f020000;
    }
    public static final class layout {
        public static final int main=0x7f030000;
    }
    public static final class string {
        public static final int app_name=0x7f040001;
        public static final int hello=0x7f040000;
    }
}


プロジェクト上のR.javaには、ファイル上で定義された全リソースへのインデックスが記述されています。ソースコードからこのクラスを使用すれば、簡単にプロジェクトに含まれるリソースを参照することができます。この機能は特にEclipseのようなIDEのコード補完機能と組み合わせると強力です。探している参照を素早く、インタラクティブに配置することができます。

もしかしたら、上記とは若干違うものが表示されているかもしれません(恐らく16進数の値が違うかもしれません)。ここでは、内部クラス”layout”とそのメンバ変数”main”を取り上げてみましょう。Eclipseはmain.xmlという名前のXMLレイアウトファイルを参照し、ここにあるようなクラスを生成します。プロジェクトに他のリソース(res/values/string.xmlファイルの文字列やres/drawable/フォルダの描画リソースなど)が追加された場合にも、EclipseはR.javaを変更します。

Eclipseを使っていない場合は、クラスファイルは(Ant toolで)ビルドする際に自動生成されるでしょう。

なお、このファイルを開発者自身が直接編集してはいけません。

プロジェクトのデバッグ
EclipseAndroidプラグインにはEclipseデバッガも統合されています。ソースコード中にバグを埋め込んで、それを実際に確認していきましょう。HelloAndroidソースコードを以下のように変更してください。

package com.android.hello;

import android.app.Activity;
import android.os.Bundle;

public class HelloAndroid extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Object o = null;
        o.toString();
        setContentView(R.layout.main);
    }
}


コード中でNullPointerExceptionを発生させるシンプルなものです。アプリケーションを再起動すると、最終的に以下のような画面が表示されます。

“Force Quit*1”を押してアプリケーションを強制終了し、エミュレータウィンドウを閉じてください。

エラーを特定するために、ソースコード中の”Object o = null;”の行にブレークポイントを置いてください(ソースコードの隣のマーカーバーをダブルクリック)。そして、メニューの実行 > ヒストリーのデバッグ > Hello, Android を選択し、デバッグモードで実行してください。アプリケーションはエミュレータ上で再起動しますが、今回はセットしたブレークポイントに到達した段階で処理を中断します。どんなアプリケーションであっても、Eclipseデバッグパースペクティブでコードをステップ実行することができるのです。

Eclipseなしでプロジェクトを作成
Eclipseを使わない場合(例えば、別のIDEが良い場合や単純にテキストエディタコマンドラインツールを使う場合)、Eclipseプラグインは当然使えません。でも、心配は無用です。Eclipseを使わなくても機能が制限される訳ではありません。

EclipseAndroidプラグインは、実は単にAndroid SDKを含めたツール一式のラッパーなのです(エミュレータやaapt, adb, ddmsなどのツールについては、他の箇所でドキュメント化されています)。このため、”ant”のビルドファイルなど他のツールで、Androidツールをラップすることもできます。

Android SDKには”activitycreator.py”というPhthonスクリプトがあり、ant用のbuilld.xmlと同様にプロジェクトの全ソースコードディレクトリのスタブを作成するのに使えます。このスクリプトを使用すれば、コマンドラインからプロジェクトを構築したり、好きなIDEと統合したりすることができます。

例えば、Eclipseで作ったものと似たようなHelloAndroidプロジェクトを作成するには、このコマンドを実行してください。

activitycreator.py --out HelloAndroid com.android.hello.HelloAndroid


プロジェクトをビルドするには、“ant”を実行します。上記コマンドの実行が成功した後、”bin”ディレクトリの下に、HelloAndroid.apkというファイルが作成されているはずです。.apkファイルはAndroidパッケージのことであり、”adb”ツールを使ってエミュレータ上にインストールし実行することができます。

このツールの使用方法の詳細は、前述したドキュメントを参照してください。

                                                                                                                        • -

Android翻訳目次へ

*1:原文の画面上では”Force close”ボタンなのですが、文中では”Force Quit”となっています。バージョンアップした際の修正漏れですかね。