アクティビティを開始して戻り値を取得する
ここでは新しい アクティビティを追加し、そのアクティビティを開始し、そしてそのアクティビティを閉じるときに元のアクティビティで結果コードを取得する方法を説明します。
Eclipse の使い方の説明を兼ねて、アクティビティの追加方法も示します。
ここで作成するデモプログラム
まずはここで作成するデモプログラムの動作をみてみましょう。UI のレイアウトなどは特に凝ったところもありませんので、ここでは説明しません。 不安な方は はじめてのアンドロイドプログラム などをみてください。
メインのアクティビティにボタンがあります。これをクリック (タップ) します・・・
すると新しいアクティビティが開始されて表示されます。ボタンが二つあります。
キャンセルの方をクリックするとアクティビティは閉じて・・・
メインアクティビティ側で結果コードを取得して、クリックしたボタンに応じた動作ができました。
Eclipse でアクティビティを追加する
アクティビティは android.app.Activity の派生クラスとして作成します。 そして、新しく作成したアクティビティを AndroidManifest.xml に追加すれば OK です。
この作業を Eclipse の GUI で少し簡単にできるので、その手順を説明します。
AndroidManifest.xml を開きます。すると次のような編集画面が表示されます。
この画面の下の方に行くと、 アプリケーションノード (Application Nodes) の編集フォームがあります。
Add... をクリックして、出てきた画面で新しい要素を作成する (Create a new element...) を選択して Activity を選んで OK をクリックすれば、 Activity というエントリが AndroidManifest.xml に追加されます。
新しく作成された要素を左側のリストで選んだ状態にして、 右側の Name をクリックすると、クラスを定義するコードの設定画面が表示されます。
ここでは AddItemActivity という名前のアクティビティを定義していますが、この名前は任意です。 Finish をクリックすれば *.java ファイルが作成されます。
最後に、これはどういうわけか分かりませんが、この操作で作成された要素名に . が抜けているので追加しておきます。
ドキュメントを読む限り、activity の name 属性には完全なクラス名を記述するべきで、 クラス名だけに省略する場合は manifest の package からの相対パスを記述するようです。 そのもとのパッケージ名を省略するときにドット(.) が使われるようですから、ドットを書いておいた方が良いようにおもいます。
アクティビティの開始
ここではアクティビティを開始して、後で結果コードを取得しようと考えていますから、 startActivityForResult でアクティビティを開始します。
Intent を作成して起動しますが、この時にアクティビティのクラスを明示的に指定しています。このように起動するアクティビティを明示的に指定してインテントを作る場合と、 アクションを指定する暗黙的な場合があります。インテントについてはまた別のページで説明します。
startActivityForResult に渡している requestCode は複数のアクティビティが存在する時に、それぞれ識別するために用いられます。
package com.keicode.android.test;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class ActivityTest1 extends Activity
implements OnClickListener {
Button addButton;
int requestCode = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
addButton = (Button)findViewById(R.id.button1);
addButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.button1:
startActivityForResult(
new Intent(this, AddItemActivity.class),
requestCode);
break;
}
}
...
}
結果コードの設定と取得
開始されたアクティビティで結果コードを設定するには、 setResult を用います。
...
public class AddItemActivity extends Activity
implements OnClickListener {
...
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.ok_button:
setResult(1);
finish();
break;
case R.id.cancel_button:
setResult(0);
finish();
break;
}
}
}
finish でアクティビティを終了すると、元のアクティビティの onActivityResult が呼び出されます。ここで結果を取得できます。
@Override
protected void onActivityResult(
int requestCode,
int resultCode,
Intent data) {
if(requestCode == this.requestCode){
if(resultCode == 1){
Toast.makeText(
this,
"OK was clicked.",
Toast.LENGTH_LONG).show();
}
else{
Toast.makeText(
this,
"Cancel was clicked.",
Toast.LENGTH_LONG).show();
}
}
}
onActivityResult の第一引数に渡される値は、 startActivityForResult に渡したリクエストコードです。 resultCode には setResult でセットした値が入ります。 第三引数は追加のデータですが、ここではここでは利用していません。