読者です 読者をやめる 読者になる 読者になる

ひだまりソケットは壊れない

ソフトウェア開発に関する話を書きます。 最近は主に Android アプリ、Windows アプリ (UWP アプリ)、Java 関係です。

まじめなことを書くつもりでやっています。 適当なことは 「一角獣は夜に啼く」 に書いています。

Android アプリ開発独習メモ #2

Learning Android アプリ

さらに Android アプリ開発の勉強メモ。 前回は “Building Your First App” の途中まで進めたが、この記事は “Building Your First App” の最後まで。

Starting Another Activity

ボタンクリックに対する応答

UI 記述用の XMLandroid:onClick 属性 を使用することでクリック時に呼ばれるメソッドを指定できる。 この属性の値は Activity の以下の満たすメソッドの名前にする。

  • public である
  • 返り値は void
  • パラメータは 1 つだけとり、その型は View

資料には書かれていないが、View#setOnClickListener メソッドを使うことでもクリックへの応答を設定することができる。 例は以下。

// XML 側 (一部のみ)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" (略)

    <TextView android:id="@+id/status_message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/send_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button_send" />
// Java 側

// 下記処理の一部に必要な import 文
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

// 処理の一部
    Button sendButton = (Button)findViewById(R.id.send_button);
    sendButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            TextView t = (TextView)findViewById(R.id.status_message);
            t.setText("clicked");
        }
    });

イベントリスナの設定は XML に書くより Java 側に書いた方が柔軟性が上がって良いんじゃないかなー、と思った。

Intent の構築

Intent は、別々の部品間 (例えば 2 つのアクティビティ間) の実行時の繋ぎ合わせ (runtime binding betweet separate components) を提供するもの。 アプリの “何かをするという意図” を表すのである。 広い範囲のタスクのために Intent を使用できるが、別の Activity を開始するために最もよく使用される。

Intent クラスのインスタンス生成は下記のようになる。 第 1 引数として Context をとる。 Activity クラスは Context クラスのサブクラスなので、Intent コンストラクタの第 1 引数として使用できる。 第 2 引数は、Intent を届ける先のアプリ部品を表す Class オブジェクト。

Intent intent = new Intent(this, DisplayMessageActivity.class);

Intent は別の Activity を開始するだけでなく、データの塊をその Activity に運ぶこともする。 Intent は、extras と呼ばれる key-value ペアとして様々な種類のデータの集まりを運ぶ。 Intent#putExtra メソッド は、第 1 引数にキーを、第 2 引数に値をとる。

Intent を受け取った Activity が extra データに対して問い合わせできるように、(Intent を送出する側の?) Activity の public な定数として extra のキーを定義しておくと良い。 また、キーの接頭辞としてパッケージ名を付けるようにするのがベストプラクティスらしい。 こうすることで他のアプリとやりとりする場合に一意性が保証される。

次の Activity の開始

Activity を開始するために startActivity メソッドを呼び出す。 このとき、引数として Intent を渡す。

Activity の作成

ここまで、別の Activity の呼び出し方を見てきた。 上の例では DisplayMessageActivity という Activity が呼び出されることになるが、肝心の DisplayMessageActivity はまだ作られていないので作る必要がある。

Eclipse だと “New” から “Other” を選んで、“Android” の “Android Activity” を選択し、そのまま必要事項を入力していけば Activity が作成される。 manifest への追加なども自動的に行われるので特に気にする必要はない。 Hierarchical Parent として別の Activity を指定することで、自動的にアクションバーの “Up” 動作 (アプリの階層構造の 「上へ」 行く?) を扱うための onOptionItemSelected メソッドの実装も自動的に生成される。

ActionBar APIHONEYCOMB (API level 11) 以降でのみ使用可能なので、アクションバー周りのコードには条件文が入ってたりする。

Activity のサブクラスは、onCreate メソッド を実装しなければならない。 このメソッドは、新しくインスタンスが生成されるときにシステムによって呼び出される。 このメソッドの中で setContentView メソッド を使って activity のレイアウトを指定しなければならない。 また、activity の部品のためのセットアップもここで行うべきである。

Intent の受け取り

ユーザーがどのようにして Activity に来たかに関わらず、すべての Activity は Intent によって呼び出される。 Activity を開始した Intent を取得するために getIntent メソッドがある。 そして、その Intent から extra (データ) を取り出すことができる。

テキストの表示

テキストを表示するには TextView を使う。 このクラスのインスタンスsetText メソッド によりテキストの設定ができる。

Activity のルートビューとして TextView を使用するには、Activity#onCreate メソッドの中で TextView オブジェクトを setContentView メソッド に渡せばよい。

別のアプリに Intent を送ることについて

このレッスンで作成した Intent は、明示的な Intent だとみなすことができる。 なぜなら、この記事における Intent は、アプリ内のどの部品に渡されるべきものであるか指定されていたからである。 一方で、Intent は暗黙的になることもできる。 すなわち、特定の部品を指定することなく、端末にインストールされている任意のアプリがその Intent を受け取ることを可能とする。

まとめ

  • ボタンクリックなどのイベントに対するリスナは XML 側で android:onClick 属性を使って指定することも、Java 側で View オブジェクトの setOnClickListener メソッドを呼び出して指定することもできる。
  • 別の Activity を開始するためには Intent を使用する。
  • Intent には Activity を開始する役割だけでなく、データを運ぶ役割もある。