連載
» 2009年02月05日 00時00分 公開

Androidで動く携帯Javaアプリ作成入門(3):ブラウザや地図、ストリートビューの基、Intentとは? (2/3)

[緒方聡,株式会社イーフロー]

Editor Activityのレイアウトも編集

 Main Activityのときと同様の方法でEditor Activityのレイアウトも編集します。

図5 Editor Activityのレイアウト 図5 Editor Activityのレイアウト

 Main ActivityにもEditor Activityにも「Button01」というIdがありますが、IdはActivity単位でユニークになっていれば同じ名前を使用しても問題ありません。

「Android Resource Editor」でリソースの定義と指定

 Idを「TextView01」と指定したい場合、レイアウト定義ファイルには「@+id/TextView01」と記述されています。一見分かりづらいです

@[パッケージ:][+]リソース型/リソース名

が、書式は以下のとおりです。

 [パッケージ]は省略可能です。[+]は特別な意味を持っているので、後述します。

 リソースを参照するにはあらかじめリソースを作成しておかなければなりません。例えばIdを作成するには、「res/values/ids.xml」を作成し、ADTの機能の1つ、「Android Resource Editor」で編集します。

図4 Android Resource EditorでIdを作成したところ 図4 Android Resource EditorでIdを作成したところ

 作成したXMLファイルの先頭には、以下のXML宣言が必要です。

<?xml version="1.0" encoding="utf-8"?>

 Idの場合は、ids.xmlというファイルを作成してリソースを定義しました。必ずしもこの名前である必要はありませんが、慣習として以下の名前が使用されています。

名前 役割 参照方法(XML) 参照方法(Java)
res/anim/xxx.xml アニメーションを定義 @anim/xxx R.anim.xxx
res/layout/xxx.xml レイアウトを定義 @layout/xxx R.drawable.xxx
res/values/arrays.xml 配列を定義 R.array.xxx
res/values/attrs.xml カスタムレイアウトを定義 R.styleable.xxx
res/values/colors.xml 色を定義 @color/xxx
@drawable/xxx
R.color.xxx
R.drawable.xxx
res/values/dimens.xml 寸法を定義 @dimen/xxx R.dimen.xxx
res/values/ids.xml IDを定義 @id/xxx R.id.xxx
res/values/strings.xml 文字列を定義 @string/xxx R.string.xxx
res/values/styles.xml スタイルを定義 @style/xxx R.style.xxx
表2 リソースの種類と定義場所と参照方法

 上記では、ids.xmlにIdとして「foo」「bar」を定義しました。XMLでこれらを参照するには「@id/foo」「@id/bar」と記述しますが、Idに限り「@+id/qux」のように「+id」という指定をすることで、あらかじめIdリソースを作成しておかなくてもXMLで定義するほかのリソースにIdを付与可能です。ids.xmlを用意するよりも@+idを使用する方が一般的でしょう。

 Idはプログラムから参照するために使用するので、分かりやすい名前を付けるとよいでしょう。

Activityを実装して“Intent”を理解しよう

 今回のアプリは画面が2つあるので、Activityも2つ実装します。Main Activityから見ていきましょう。

Main Activityの実装

 以下はMain Activityの全ソースです。レイアウトをXMLで定義しているので、かなり短くて済みます。

 1 package com.example.android.dual;
 2
 3 import android.app.Activity;
 4 import android.content.Intent;
 5 import android.os.Bundle;
 6 import android.view.View;
 7 import android.widget.Button;
 8 import android.widget.TextView;
 9
10 public class Main extends Activity {
11
12     private static final int SHOW_EDITOR = 0;
13
14     @Override
15     public void onCreate(Bundle savedInstanceState) {
16         super.onCreate(savedInstanceState);
17         setContentView(R.layout.main);
18
19         Button button = (Button)findViewById(R.id.Button01);
20         button.setOnClickListener(new View.OnClickListener() {
21
22             @Override
23             public void onClick(View v) {
24                 Intent intent = new Intent(Main.this, Editor.class);
25                 TextView textView = (TextView)findViewById(R.id.TextView01);
26                 CharSequence text = textView.getText();
27                 intent.putExtra("TEXT", text);
28                 startActivityForResult(intent, SHOW_EDITOR);
29             }
30
31         });
32     }
33
34     @Override
35     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
36         if (requestCode == SHOW_EDITOR) {
37             if (resultCode == RESULT_OK) {
38                 TextView textView = (TextView)findViewById(R.id.TextView01);
39                 textView.setText(data.getCharSequenceExtra("TEXT"));
40             }
41         }
42     }
43 }

 15行目でonCreate()をオーバーライドしています。「Activityは、このメソッドが最初に呼び出される」というのを覚えていますか? このメソッドには、最初に行うべきことを実装しています。

 16行目は必ず必要なスーパークラスのメソッド呼び出しです。

 17行目は、あらかじめ定義しておいたレイアウトを設定しています。

 この2つは必ず最初に行わなければなりません。

 19行目でIdからButtonのインスタンスを取得し、20行目でボタンが押されたときに呼び出されるOnClickListenerを設定しています。ここで「Intent」というクラスを使用して画面遷移を行っています。

画面遷移のIntent

 Intentは、Androidアプリ作成ではActivityに並ぶほど重要なので、クローズアップして詳細に説明します。前述しましたがIntentは英語で「意図」「意志」「目的」といった意味があります。

22             @Override
23             public void onClick(View v) {
                   //第2引数に遷移先のActivityを指定してIntentを作成
24                 Intent intent = new Intent(Main.this, Editor.class);
25                 TextView textView = (TextView)findViewById(R.id.TextView01);
26                 CharSequence text = textView.getText();
                   //TextViewから取得したテキストを付加情報としてIntentに追加
27                 intent.putExtra("TEXT", text);
                   //作成したIntentとリクエストコードで遷移先Activityを起動
28                 startActivityForResult(intent, SHOW_EDITOR);
29             }

 24行目でIntentを作成します。Intentはその用途によって作成方法が異なりますが、自分のアプリ内にある画面へ遷移する場合、このように遷移先Activityを指定するのが簡単です。

 27行目でIntentにputExtra()メソッドで付加情報を与えています。付加情報は名前と値を渡し、取り出すときには名前を指定します。今回はCharSequenceを1つだけ付加情報として設定していますが、putExtra()はさまざまな型でオーバーロードされていて、複数の異なる型を組み合わせて設定可能なので、渡したいものは何でも渡せると思ってよいでしょう。

 28行目では、startActivityForResult()で遷移先のActivityを起動します。第2引数は呼び出し元のActivityで定義したリクエストコードです。このリクエストコードは呼び出し先のActivityから戻ってきたときに使用するので定数にしてあります。

呼び出し先から結果が返された際に呼び出されるメソッド

34     @Override
35     protected void onActivityResult(int requestCode, int resultCode,
       Intent data) {
36         if (requestCode == SHOW_EDITOR) {
37             if (resultCode == RESULT_OK) {
38                 TextView textView = (TextView)findViewById(R.id.TextView01);
39                 textView.setText(data.getCharSequenceExtra("TEXT"));
40             }
41         }
42     }

 35行目のonActivityResult()は、呼び出し先から結果が返された際に呼び出されるメソッドです。36行目でリクエストコードを確認し、37行目で結果コードを確認し、39行目で呼び出し先から渡された付加情報を取り出し、TextViewに設定しています。

 次ページでは、Intentを使ってWebブラウザや通話、地図アプリ、ストリートビューを使う方法について説明します。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。