Main Activityのときと同様の方法でEditor Activityのレイアウトも編集します。
Main ActivityにもEditor Activityにも「Button01」というIdがありますが、IdはActivity単位でユニークになっていれば同じ名前を使用しても問題ありません。
Idを「TextView01」と指定したい場合、レイアウト定義ファイルには「@+id/TextView01」と記述されています。一見分かりづらいです
@[パッケージ:][+]リソース型/リソース名 |
が、書式は以下のとおりです。
[パッケージ]は省略可能です。[+]は特別な意味を持っているので、後述します。
リソースを参照するにはあらかじめリソースを作成しておかなければなりません。例えばIdを作成するには、「res/values/ids.xml」を作成し、ADTの機能の1つ、「Android Resource Editor」で編集します。
作成した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はプログラムから参照するために使用するので、分かりやすい名前を付けるとよいでしょう。
今回のアプリは画面が2つあるので、Activityも2つ実装します。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は、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.