このページの本文へ

これで作れる! Androidのアプリケーション 第3回

アプリケーションの基本となる「アクティビティ」

2010年07月15日 12時00分更新

文● 塩田紳二

  • この記事をはてなブックマークに追加
  • 本文印刷

リソースを使う
レイアウトファイルはXMLで記述する

 さて、このサンプルアプリケーションでは、onCreateは以下のようになっています。


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Toast.makeText(this, "onCreate", Toast.LENGTH_SHORT).show();
Log.d("onCreate","Running");
}

 メソッドの中では、最初に親クラスのonCreateを呼び出し、その次に「setContentView」というメソッドを実行しています。画面に表示されている文字列「Hello World, MyMainActivy!」は、このメソッドの実行結果として表示されているのです。  ここで問題になるのが、引数の「R.layout.main」です。「R」は、アプリケーションで定義したリソースを意味し、これは、layoutのmainというリソースを内容として表示させるという意味になっています。

 では、このlayoutのmainはどこにあるのでしょうか? これは実体としてはxmlで記述されたファイルです。これをレイアウトファイルといいます。Eclipseのパッケージエクスプローラーを開き、resフォルダにあるlayoutを開いてみます。ここに「main.xml」があるはずです。これをダブルクリックしてみましょう。すると、エディタ領域にxmlファイルが表示されます。

res/layoutフォルダーのmain.xmlをダブルクリックすると、GUIエディターが開く。xmlの編集画面に切り替わる

 Androidでは、Activityが実際に表示する画面をこのようにレイアウトファイルとして定義します。これをsetContentViewで読み込むことで画面を表示させているのです。Androidでは画面を表示させるのに、このようなレイアウトファイルを使う方法とは別に、直接ボタンやテキスト欄をプログラムコードで定義する方法もあります。このほうがxmlファイルを別に作らないので簡単そうに思えますが、横向き画面などさまざまな表示方法に対応するのが面倒になるため、基本的には単純な画面であってもxmlファイルを作成する方法をお勧めします。

 今度は、表示されているエディターの下にあるタブ「Layout」をクリックしてみます。するとGUIエディターが表示されるはずです。先ほどのメッセージを表示しているのは、「TextView」というオブジェクトです。View(ビュー)とは、簡単にいうとGUIの部品のことです。このビューを組み合わせて画面を作ります。

 Eclipseの右側にアウトラインという領域があり、これが、レイアウトファイル内のビューの構造をあらわしています。サンプルプログラムの場合「LinearLayout」の中に「TextView」が入っていることになっています。

 ビューは、ボタンやテキストのようにユーザーに見えるもので、位置や大きさを持っています。しかし、これらをどう配置するのかは、上位にあるLayoutが決めます(一般的なレイアウトという用語と混乱しないようにクラス/オブジェクトの場合にはアルファベットで表します)。LinerLayoutとはその名前のとおり、内部のビューを直線的に配置します。配置の方向には縦と横があり、このサンプルでは縦が指定されているので、TextViewを追加すると上下に並ぶようになります。

 レイアウトファイルでは、こうしたレイアウトやビューの構造を定義するとともに、それぞれのプロパティ値も定義します。右側のアウトラインにある「LinearLayout」をダブルクリックしてみてください。下にプロパティが表示されるはずです。これをスクロールさせていくと「orientation」というプロパティ値として「virtical」が定義されているはずです。

res/右側のアウトラインで「LinearLayout」を選択し、下で「プロパティー」タブを選択すると、LinearLayoutのプロパティ(設定値)を編集できる

 今度は、アウトラインで「TextView」をダブルクリックしてみてください。「Text」というプロパティには、「@string/hello」という値が定義されています。Textは、TextViewが表示するテキストを定義するものですが、この「@string/hello」という値は、helloという名前の文字列リソースを使うという意味になります。つまり別の場所で文字列が定義されているのです。

 その定義は、valuesのstring.xmlです。上記の表記は「values/string.xmlで定義されているhelloという名前の文字列値」になります。このようにレイアウトなどのリソースの中では、このような表記方法でリソースを指定できるのです。なぜ、このような表記を使い、直接文字列を書かないのかというと、ローカライズをするときにレイアウトを言語から独立させるためです。つまり日本語用のhelloと英語用のhelloを別々に定義しておけば、レイアウトファイル自体は修正せずに日本語にも英語にも利用できるようになるからです(もちろん言語によってレイアウト自体を切り替えることもできます)。

 このhelloはEclipseのパッケージエクスプローラーでresの下にあるvaluesフォルダ内のstring.xmlで定義されています。これをダブルクリックしてみましょう。こんどは、リソース編集用のエディターが表示されます。

res/valuesフォルダにあるstrings.xmlをダブルクリックで開くと、文字列リソースの編集画面になる。ここでhelloという名前(ID)に、実際に表示される文字列が定義されている。プログラムではこのhelloという名前だけを扱う

 エディター内左側のリストでhelloを選ぶと、右側の「value」欄に「Hello World, MyMainActivity!」と定義してあるのがわかります。なおxmlが表示されたときには、エディター下の「resource」タブをクリックしてください。

 Androidのアプリケーションは、Activityクラスの定義などのコードだけでなく、レイアウトファイルやリソース値ファイルなどを作成することで行ないます。単純なプログラムを作るときには、この構造がすごく面倒に見えるのですが、実際のプログラムでは、複数解像度、縦横表示、そして複数言語への対応が必要となります。これをコードですべて書いてしまうと、さまざまな組み合わせに対処しなければならなくなってしまいます。たとえば高解像度で言語は英語、画面が横向きといった条件を記述しなければならなくなります。これはかなり大変な作業だし、間違いも起こりやすくなります。なにより開発者自身が状態を把握しきれなくなります。

 これに対して、xmlファイルでレイアウトやリソース値を定義する場合、画面サイズ、言語、画面の向きをファイル名やフォルダー名で区別して作っておくと、システムの状態により、リソースを自動的に切り替えることができ、コード部分では、画面サイズや言語、画面の向きをなにも考えることなく記述ができます。Androidアプリケーションとしてマーケットに出すなら、より多くの画面サイズに対応したほうがいいでしょうし、せめて日本語と英語ぐらいは用意すべきです。また、アプリケーションとして画面の縦横に対応しないのも問題でしょう。

 最初のサンプルプログラムで、マシンを横向き表示にしたときに、すでにアプリケーションが起動しているにもかかわらず、onCreateから実行されたのは、横向き画面用のレイアウトファイルなどが定義されていたときのためなのです。onCreateでXMLのレイアウトファイルを読み込むようになっていれば、横向きにしたときに、再度onCreateが実行され、横向きのレイアウトファイルが読み込まれて表示が行なわれます。この部分については、プログラムコードは何もする必要がありません。

 こうしたメリットがあるので、本格的にアプリケーションを開発するときには、かならずリソース値やレイアウトをxmlファイルとしてプログラムコードから独立させるようにしてください。また一部の解説書などでは、リスト表示を簡略にするためにボタンなどをすべてプログラムコードで記述しているものがあります。サンプルとしては問題ないのですが、ユーザーに配布する本格的なアプリケーションを作ることを考えると、こうしたコードですべてを記述する構造はあとあと書き直しをする必要があって面倒なことになります。

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン