Hello, World
Android1.0の記事から多少内容が変わっていました。大きく違うのは、strings.xmlファイルでAndroidに表示する文字列を定義するところかな。
原文:http://developer.android.com/guide/tutorials/hello-world.html
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
開発者が初めてAndroidで”Hello World!”を書いたとしたら、とても簡単だという印象を受けるはずです。実際、本当に簡単なのです。IDEにEclipseを使えばさらに簡単です。プロジェクトの作成や管理を行う強力なプラグインを提供しているため、開発スピードが格段に速くなるはずです。
Eclipseを使っていない場合でも、大丈夫です。「その他のIDEでの開発」を読んだ後、この章に戻ってきてEclipseについてのすべての記述を無視すれば良いのです。
以降を始める前に、まずは最新のSDKがインストールしてください。もしEclipseを使用するなら、ADTプラグインもインストールしてください。インストール方法は「Android SDKのインストール」を参照してください。
以降に表示されているスクリーンショットを大きくしたい場合には、画像をクリックしてください。 |
プロジェクトを作成する |
1. 新規Androidプロジェクトを開く
Eclipseメニューの ファイル > 新規 > プロジェクトを選択します。EclipseのAndroidプラグインのインストールが成功していれば、結果ダイアログの”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を構築する |
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-O(Macの場合は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!”を実行する |
次に、”Androidアプリケーション”を選択して、左上端のアイコンをクリックするか(端に+マークがある1枚のシートのようなアイコン)、”Androidアプリケーション”をダブルクリックしてください。”新規構成”という名前の新規ランチャーが表示されるはずです。
名前を“Hello, Android”のように何か意味を持った名前に変更し、プロジェクトの参照ボタンをクリックしてプロジェクトを選択してください(Eclipse上で複数のAndroidプロジェクトが存在する場合には、適切なものを選択してください)。プラグインは選択されたプロジェクトにあるActivityサブクラスを自動的に検索し、アクティビティラベルにあるドロップダウンリストに追加します。”Hello, Android”プロジェクトに1つしかアクティビティを持たない場合には、デフォルトアクティビティを選択して次に進んでください。
“適用”ボタンをクリックします。以下に例を示します。
実行を押して、Androidエミュレータを起動し、アプリケーションを実行しましょう。起動後、アプリケーションが表示されるはずです(起動後、MENUキーを押してエミュレータの電話のロックを解除する必要があります)。ここまでの手順を全て完了できていれば、以下のような画面が表示されるはずです。
これで、Android版”Hello, World”は終わりです。すごく簡単だったでしょう?チュートリアルの次のセクションでは、より詳細で有益なAndroid情報を提供していきます。
XMLレイアウトへのUIのアップグレード |
このため、Androidは代わりとなるUI構築のモデルを提供しています。XMLベースのレイアウトファイルです。例とともに、このコンセプトを説明します。以下は、さきほど完成したプログラムと全く同じ振る舞いをするXMLレイアウトです。
AndroidのXMLファイルはシンプルな構造になっています。ツリー構造のタグがあり、各タグ名は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; } }
もしかしたら、上記とは若干違うものが表示されているかもしれません(恐らく16進数の値が違うかもしれません)。ここでは、内部クラス”layout”とそのメンバ変数”main”を取り上げてみましょう。Eclipseはmain.xmlという名前のXMLレイアウトファイルを参照し、ここにあるようなクラスを生成します。プロジェクトに他のリソース(res/values/string.xmlファイルの文字列やres/drawable/フォルダの描画リソースなど)が追加された場合にも、EclipseはR.javaを変更します。 Eclipseを使っていない場合は、クラスファイルは(Ant toolで)ビルドする際に自動生成されるでしょう。 なお、このファイルを開発者自身が直接編集してはいけません。 |
プロジェクトのデバッグ |
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のAndroidプラグインは、実は単に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”ツールを使ってエミュレータ上にインストールし実行することができます。
このツールの使用方法の詳細は、前述したドキュメントを参照してください。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
*1:原文の画面上では”Force close”ボタンなのですが、文中では”Force Quit”となっています。バージョンアップした際の修正漏れですかね。