Step2 ファイルの構成とJavaの仕組み
リソースの管理
次にどのような構造でエミュレーターにアクティビティの「Hello World, HelloWorld!」が表示されているのか確認します。「Hello World, HelloWorld!」文字列の所在を追いかけてリソースに関しての知識を深めましょう!
Javaでは中心となるJavaファイルの中身が冗長にならないように、構造上、画像や文字列、レイアウト(以下、リソースと呼びます)などを外部のxmlファイルに記述します。
そしてそれらはビルド時に生成されるR.javaファイルに、プライマリーなidと共に格納されていきます。R.javaファイルは[gen]→[com.example.helloworld]→[R.java]に置かれています。
確認してみると、リソースそれぞれに固有なidが振り当てられています。ちなみにR.java内は改変できないようになっていますので、何も手を加えないでください。
これらはリソースが追加され、ビルドされると自動的に追加、更新されます。こうして各種リソースは管理されているのです。
次にHelloWorld.javaの最終行を見てみましょう。
HelloWorld.java public class HelloWorld extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } } |
とあります。
setContentViewというのは、画面に表示するレイアウトを指定する記述(メソッド)で、これはRクラス内のlayoutクラスのmainというリソース名でビルドされたものを画面に表示することを示します。
次にそのレイアウトというものを確認します。[res]→[layout]→[main.xml]を開いてみてください。
ここにはアクティビティのレイアウトを生成するXMLを記述しますが、視覚的に編集しやすいGraphical Layoutも用意されています。
このうち、main.xmlのタブを開いてみます。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout> |
このHelloWorldでは、「LinearLayout」というレイアウトが採用されています。
Android™ ではプラットフォームレベルでレイアウトシステムを導入しており、実際には5つのレイアウトが用意されています。レイアウトを指定すると、リソースを追加した際に一定のルールで配置されます。「LinearLayout」というのは、リソースを縦または横一線に並べるレイアウトです。前回エミュレーターで実行したHelloWorldも、タイトルと横一線に「Hello World, HelloWorld!」がレイアウトされていましたよね?それがここに記述されているのです。
今度はTextViewの欄に注目してください。
android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" |
とあります。
という記述が見つかります。これが「Hello World, HelloWorld!」文字列のレイアウトを呼び出し、設定している記述です。
この文字列は、上の二行でレイアウトを指定されています。さらによく見てみましょう。
「android:layout_width」は横幅、「android:layout_height」は高さを設定する記述です。
"fill_parent" は横幅いっぱいに表示され、"wrap_content" は表示に必要なレイアウトに自動で調節する記述です。
前回の実行画面でも、文字列は途中で改行されることなく横幅いっぱいまでレイアウトされ、縦で言えばタイトルの真下に余白なく調節されていました。
このようにAndroid™ がプラットフォームレベルでレイアウトを用意していることで、全体の見栄えも良く、プログラミングする側にも分かりやすいというメリットがあります。
今度は「Hello World, HelloWorld!」文字列そのもののリソースを確認します。
[res]→[values]→[string.xml]を開いてみましょう。
ここには実際の文章を生成するXMLを記述します。フォームに沿って入力するだけでXMLを生成できるリソースタブとstrings.xmlタブの二つが用意されています。
どちらも同じことが書かれているのですが、まずはstrings.xmlタブの方を見てみましょう。
このファイルの中の記述に、「Hello World, HelloWorld!」を見ることができると思います!Resourcesタブの[hello(string)]をクリックしても確認できますね。
ちなみにapp_nameはタイトルを示しています。
つまり一口にリソースをXMLに記述してあると言っても、実際の文字列は[string.xml]に、そのレイアウトは[main.xml]に記述され、ビルドの際にR.javaファイルのRクラスにその文字列とレイアウトが呼び出され、最終的にレイアウトが「R.layout.main」としてHelloWorld.javaに呼び出されるという処理が行われているわけです。
試しに[string.xml]の「Hello World, HelloWorld!」の文字列を「Hello Android!」に書き換えて実行してみましょう。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello Android!</string>
<string name="app_name">HelloWorld</string>
</resources> |
エミュレーター内の表示も変わったと思います。(変わったのを確認できたら元に戻しておきましょう)
今回は、すでに表示されている文字列がどのようなルールで記述・配置されているかを確認しましたが、新たにアクティビティ、ボタンやメニュー・画像や文字列(リソース)を追加する際は、これと全く反対の順書で行えばよいのです。Step3で、実際に試してみましょう!
第2回 Android™ 向けアプリの基礎をマスターしよう
Step1 アクティビティとは一体?
Step2 ファイル構成とJavaの仕組み
Step3 新しいアクティビティを作って行き来してみよう