Android Eclipseでの新規作成プロジェクトを読み解いてみる

Eclipse(私は Aptana Studio に構築) で Android 開発環境を構築し、新規プロジェクトから作成して、シミュレータで未編集のアプリケーションが立ち上がる、という状態を前提として、生成されたプロジェクトを読み解いてみる。

バージョンは、執筆時点でシェアが約4割だといわれる v2.1 で進める。

ディレクトリ構造

生成されたディレクトリの構造と役割はこんな感じ?

+ src
| + com
|   + example // パッケージ名ディレクトリ
|     + ProjectnameActivity.java // デフォルトの Actvity クラス
+ gen // 以下は src から生成されるので直接編集はしない
| + com
|   + example // パッケージ名ディレクトリ
|     + R.java // リソースクラス
+ assets // 読み込み専用で上書きできないリソースを配置するディレクトリ
+ res
|  + drawable-hdpi // 高解像度用画像ディレクトリ
|    + icon.png
|  + drawable-ldpi // 中解像度用画像ディレクトリ
|    + icon.png
|  + drawable-mdpi // 低解像度用画像ディレクトリ
|    + icon.png
|  + layout
|    + main.xml // デフォルトのレイアウト定義
|  + values
|    + string.xml // デフォルトの文字列定義
+ bin // コンパイルしたバイナリデータ格納ディレクトリ 直接編集はしない
+ default.properties // ツールが生成・更新するので直接編集はしない
+ AndroidManifest.xml // アプリケーションの情報を記述する定義ファイル
+ proguard.cfg // ProGuard というコード難読化ツールの設定ファイル

まだはっきりと用途がわからないファイルもありますが、とりあえずこんな構成ってことで。

ビューのレイアウト定義

Eclipse から シミュレータ上でこのアプリを実行すると表示される画面について読み解く。

下のほうはどうせ真っ黒なので割愛。

注目すべきは、このレイアウト定義がされている場所とタイトルバーと画面に出ている文字です。

(Table_layout となっているのは、View チュートリアルの Table Layout で作ったプロジェクトのキャプチャだからです)

レイアウトの定義は、res/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>

エディタで開くと、ルート要素に LinearLayout があり、その子要素として、TextView が配置されています。

LinearLayout の属性にはandroid:orientation=”vertical” が指定されていて、これは、子要素を縦方向に並べるという指定です。

今は TextView が一個しか入っていないのでわかりにくいですが、TextView をコピペして二つにしてみると、上下に二段並ぶので、その効果がわかりやすくなります。

前後しましたが、TextView はその名の通り、文字列を表示するビューです。

デフォルトでは、Hello World, ProjectnameActivity! と表示されているはずです。

この xml には、縦方向に並べる LinearLayout というコンテナと、その子要素として、TextView を配置している、ということがわかりました。

main.xml の参照

ではこの main.xml がどのように読み込まれているのかを追っていきます。

src/ 以下の ProjectnameActivity.java を開きます。

package com.example;

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

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

アクティビティとは、とりあえず、画面の裏で動くロジック、だと今のところ捉えればよいです。

このクラスの onCreate() に注目します。

これは、アプリケーションが起動して、画面を表示する際に呼ばれるメソッドです。

二行のうち、最初の一行は親クラス(Activity)の onCreate() を呼んでいるだけで、注目すべきは二行目の setContentView() です。

setContentView() もその名の通り、表示すべきビューを設定する Activity クラスのメソッドですが、引数に R.layout.main を渡しています。

R.layout.main とは何か探るために Eclipse が自動的に更新するので編集する必要は無いですが、gen/ 以下の R.java を開いてみます。

package com.example;

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.layout.main はこのクラスのインナークラスのプロパティである main=0x7f030000 を参照していることになります。

これらの定数は、res/ 以下のレイアウトや画像などのリソースに対して内部的に割り当てられるアドレスで、この定数を参照することで、リソースを指定することが出来ます。

つまり setContentView(R.layout.main); は res/layout/main.xml を ビューとして読み込む、ということです。

こうして、さっきの main.xml による画面定義が読み込まれ、ビューを生成していることがわかりました。

文字列リソース

画面のタイトルバーの Table_layout と TextView の Hello World, ProjectnameActivity! がどこから来ているのかを追います。

これら文字列の実体は、res/values/strings.xml に記述されています。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, Table_layoutActivity!</string>
    <string name="app_name">Table_layout</string>
</resources>

これらを書き換えれば、画面上の文字列を変えることができます。

では、TextView に表示されている文字列(Hello World, ProjectnameActivity!)について追います。

TextView が定義されている、res/layout/main.xml の TextView を見に行きます。

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    />

android:text=”文字列” で表示したい文字列をセットできます。

ここでは、”@string/hello” がセットされていますが、これは、res/values/strings.xml の resource > string の name が hello の要素の値を参照していることになります。

文字列(“”)の中で @ からはじめるアクセス方法で、values/ 以下の文字列リソースを参照できます。

文字列に @ を使いたい場合は @ のようにエスケープする必要があります。

次はタイトルバーの Table_layout ですが、AndroidManifest.xml を開くと、同じような記述が見つかります。

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Table_layoutActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

@string/app_name で res/values/strings.xml の resource > string の name が app_name に設定されている文字列を取得しているのがわかります。

さらに、android:icon=”@drawable/icon” というのにも少し注目すると、文字列同様にres/drawable-XXXX/icon.png にアクセスしているのがわかります。

レイアウトやフォームを定義した xml 内で、これらのリソースにアクセスしたい場合は、@drawable/hoge や @string/hoge のようにアクセスすることができることがわかりました。

デフォルトのプロジェクトを生成しただけでも、起動可能なアプリケーションが出来上がっていたので、お作法を調べるついでに、読み解いてみました。

どのようにリソースにアクセスできるのか、がわかってくれば、新しく作ったレイアウトに切り替えたり、文字列や画像リソースを差し替えてみたりして、オリジナルアプリっぽく仕上げていくと楽しめながら学習できていい感じです。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする