呼び出されるアクティビティ
呼び出されたアクティビティ(リスト2)も基本的には、メインのアクティビティと同じくActivityクラスを継承したクラスです。起動され、準備が整うと、onCreateが呼び出されるなど、基本は、メインのアクティビティとまったく同じです。onCreateメソッド内でメインのアクティビティから渡されたExtraデータを取得するには、以下のようにしています。
String displayMessage = getIntent().getStringExtra(this.getString(R.string.ExtraString01));
getIntentで呼び出し元となったIntentオブジェクトを取得、これに対してgetStringExtraメソッドを使います。前述のように受け取る側は、データの型と名前を正しく把握している必要があります。 さて、このプログラムでは、ボタンを押したら、元の画面に戻るようになっており、ボタンのEventListnerは、以下のようになっています(このメソッド名がsub.xml内でon clickに定義されています)。
public void returnButtonPushed(View v){
String returnText = myEditText.getText().toString();
returnIntent.putExtra(this.getString(R.string.ExtraString01),returnText );
setResult(RESULT_OK, returnIntent);
finish();
}
ここで使うretrunIntentは、SubActivityクラスの先頭で定義されています。というのは、onCreateの中でもretrunIntentを参照しているためです。
ここでは、returnIntentにputExtraで、EditTextに設定された文字列をセットし、setResultでリターンコードを設定しています。そののちfinish()で、実行を終了します。このあと、ActivityなのでonPauseやonStrop、onDestroyがあれば呼び出されます。
setResultは、メインアクティビティに実行の結果を通知するために必要なものです。RESULT_OKはその綴りの通り、インテントとしては成功したことを返すためのものです。
実は、onCreateにも、インテントから戻るためのコードがあります。それがこれです。
returnIntent = new Intent();
setResult(RESULT_CANCELED, returnIntent);
これは、ユーザーがBackキーを押したときと、ボタンを押したときを区別するためのものです。インテントでの画面遷移は、遷移先でBackキーを無効にしない限り、ユーザーがBackキーを押したら、元のアクティビティに戻るようになっています。このため、Backキーを押したときには、前述のボタン用のEventListnerは実行されません。そうなると、元のアクティビティに結果を通知できません。そこであらかじめsetResultを実行しておき、ボタンを押したときには、これを上書きさせ、そうでないときには、onCreateでのsetResultが有効になるようにしています。もちろん、これは、ユーザーがボタンを押したときと、Backキーを区別するためにやったことです。区別する必要がなければ、たとえば、ボタンで単にfinish()だけを実行するようにして、onPauseなどで、setResultを実行するという方法もあります。
呼び出されるアクティビティ側では、このようなインテントやExtraデータの扱いに注意するだけで、あとは、メインアクティビティと同じように作ることができます。
戻り値を受け取る
では、今度は、メインアクティビティで戻り値を受け取るところを見てみましょう(リスト1)。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == R.id.IntentRequestGeneral ){
String returnMessage = data.getStringExtra(this.getString(R.string.ExtraString01));
message.setText(this.getString(R.string.MainDispString)+" " +returnMessage);
}
}
else {
Toast.makeText(this, "onActivityResult NOT RESULT_OK", Toast.LENGTH_SHORT).show();
}
}
startActivityForResultでインテントを行なうと、インテント先から戻ってきたときに、このonActivityResultが呼び出されます。このときの引数は、startActivityForResultで指定したリクエストコード、結果、そしてIntentオブジェクトです。まず必要なのは、結果(resultCode)がどうなっているかです。インテント先のアクティビティでは、ボタンを押したときには、RESULT_OK、Backキーが押されたときには、REUSLT_CANCELが戻るようになっています。このため、まずはresultCodeで判定したのち、どのリクエストコードに対応するインテントからの戻りなのかを判定しています。このサンプルでは1つのアクティビティしか呼び出していませんが、複数のアクティビティを呼び出すときには、それぞれでリクエストコードを別にしておくとここでそれぞれの処理に分岐させることができます。
その後は、IntentオブジェクトからExtraデータを取り出し、適当に処理します。このサンプルでは、TextViewに文字列データを表示させています。
アプリケーションに2つめのActivityを追加するとき
実はもう1つ作業が残っています。2つ目以降のアクティビティをアプリケーションに追加する場合、AndroidManifest.xmlにアクティビティ名を追加する必要があります。これはAndroidManifest.xmlをダブルクリックで開いて、Manifestエディタを起動し、[Application]タブを開きます。
ここにある[Application Nodes]で[Add...]ボタンを押し、表示されたダイアログボックスの上にある[Create a new element at the top level,……]を選択、下のリストから「Activity」を選びます。
すると、リストに「Activity」が追加されるので、リスト右側の[name]欄の横にある[Browse...]ボタンを押します。
表示されるダイアログには、Activityを継承しているクラスが表示されるので、追加したクラス(ここではSubActibity)を選択します。これで準備が完了します。
では、サンプルを実行してみましょう。Sample05を起動し、最初の画面でTextEditに入れた文字列は、Setボタンを押して切り替わった画面の先頭で表示され、SubActivityにあるTextEditに入れた文字列は、ボタンを使って元の画面に戻ると、一番上に表示されます。
しかし、Backキーを使って戻ると、文字列は表示されず、代わりにToastメッセージが表示されるはずです。
今回はここまで。なお次ページに今回用いたリストが用意されています。
この連載の記事
-
第11回
スマホ
アプリケーションをAndroidマーケットに登録する -
第10回
スマホ
ブロードキャストへの応答とタイマ割り込み -
第9回
スマホ
Androidアプリで複数の項目を表示するリストビューを使う -
第8回
スマホ
Androidアプリに必要なダイアログを作る -
第7回
スマホ
Androidアプリの設定画面を作成する -
第6回
スマホ
Androidアプリ内で表示されるメニューを作成する -
第4回
スマホ
Androidアプリを構成する「アクティビティ」を実際に作る -
第3回
スマホ
アプリケーションの基本となる「アクティビティ」 -
第2回
スマホ
開発したアプリをエミュレーターやデバッガ上でテストする -
第1回
スマホ
Androidアプリの開発環境であるEclipseの使い方を知る - この連載の一覧へ