コンピュータクワガタ

かっぱのかっぱによるコンピュータ関連のサイトです

Androidアプリ入門 No.01 Activityの操作

こんにちは、たまにはまじめに記事を書こうと思います。最終的にまとめて会社の勉強会で使おうと思うので、きっと続くと思います。できるだけ毎日記事を書こうと思います(もちろん記事はまとめて書いて溜めてありますw)。さて、最初はActivityの基本です。Eclipseの導入とかAndroid環境の整備だとか、実行の仕方とかはたくさん記事があると思うのでそちらを参考にしてください。はい、ここからは、ですます調ではなくなりますので、よろしくお願いしました。

追記: インテントとかサービスとかはあまり理解できていませんので、まずはそれらを使わずに何ができるかというところから紹介します。インテントとかサービスはいろんなサイトでたくさん紹介されていますので、最後のほうに私が理解できた段階で書こうと思います。

ウィジェット

ウィジェットの定義方法

まず、プロジェクトを以下の条件で作成する。

項目 内容
Project name Activity Test
Build Target Android 1.6
Application name ActivityTest
Package name sample.at
Create Activity MainActivity
Min SDK Version 4

そうすると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>

この状態でエミュレータを起動すると以下のような画面になる。

ここで、「Hello World, MainActivity!」という表示はmain.xmlファイルのTextViewに対応している。そこで、android:text属性で「@string/hello」という定義がされている。これは、res/values/strings.xmlのhelloという属性の文字列に対応していることを意味する。そのstrings.xmlファイルを見ると以下のようになっている。

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

その中で、確かにそのように定義されているのがわかる。このように基本的な画面レイアウトはxmlだけで定義でき、リテラルも別のxmlファイルで一元管理できることが分かる。もちろん、リテラルの部分を@string/helloとせずに、リテラル文字列にしても問題はない。
レイアウトについては後述するが簡単に説明する。main.xmlのルート要素となっているLinearLayoutは左上から要素を配備するレイアウトである。ルート要素はLinearLayoutである必要はない。また、ルート要素ではandroid名前空間を通常定義する。LinearLayoutのandroid:orientation属性では要素の配置方向を決める。例では縦方向の配置になっている。また、android:layout_width、android:layout_heightはそれぞれ要素の横幅、縦幅を決める。今回指定されている値fill_parentは親要素を埋めるように配置するということである。また、TextViewで使用されているwrap_contentは要素の内容にちょうどいい幅で配置する。レイアウトについての詳しい内容は後述する。

クラスからの操作

クラスからウィジェット等の要素を操作するにはmain.xmlを以下のように変更する。今回はTextViewを操作する。

<?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:id="@+id/textView1"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
</LinearLayout>

そして、MainActivityを以下のように記述する。

package sample.at;

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

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

        TextView textView1 = (TextView) findViewById(R.id.textView1);
        textView1.setText("こんにちはメインアクティビティ");
    }
}

実行結果は以下のようになる。

TextViewをActivityでも使用できるようにmain.xmlandroid:id属性を@+id/textView1のように設定した。Activity側でTextViewを取得するために、findViewByIdメソッドで、R.id.textView1を指定しTextViewのインスタンスを取得した。つまり、main.xmlで@+id/以降に記述したidのインスタンスを、Activity側で「R.id.指定したid」で取得できる。さらにインスタンスを用いて、今回のようにテキストの値を変更したりすることができる。