アクティビティ間での値の受け渡し - Android

アクティビティに値を渡し、アクティビティからの戻り値の値を受け取る方法を紹介します。

プロジェクトの作成

Android アプリケーションプロジェクトを作成します。
[New Android Application]ダイアログボックスが表示されますので、以下を設定します。
  • Application Name: "SimpleActivity"
  • Project Name: "SimpleActivity"
  • Package Name: "com.iPentec.simpleactivity"
  • Minimum Required SDK: "API 8: Android 2.2 (Froyo)"
  • Target SDK: "API 17: Android 4.2 (Jelly Bean)"
  • Compile With: "API 17: Android 4.2 (Jelly Bean)"
  • Theme: "Holo Light with Dark Action Bar"

Activityの追加

こちらの記事を参照してアクティビティを追加します。アクティビティの名前は"SubActivity"としました。

UI

以下のUIを作成します。

MainActivity

MainActivityにはEditText, Button, TextViewを一つずつ配置します。


Buttonの"On Click"プロパティに"button1_click"を設定します。

SubActivity

SubActivityにはEditText, Buttonを一つずつ配置します。MainActivityとの違いが分かるように"Background"プロパティを"#FFE0E0FF"に設定します。


Buttonの"On Click"プロパティに"button1_click"を設定します。

コード

以下のコードを記述します。

MainActivity.java

package com.iPentec.activitychange;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.content.*;
import android.widget.*;

public class MainActivity extends Activity {
  private static final int SUB_ACTIVITY = 101;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView textView1 = (TextView)findViewById(R.id.textView1);
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }

  public void button1_click(View view){
    EditText editText1 = (EditText)findViewById(R.id.editText1);
    String text = editText1.getText().toString();
    
    Intent intent = new Intent(this, SubActivity.class);
    intent.putExtra("TestData", text);
    startActivityForResult(intent, SUB_ACTIVITY);
  }
  
  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == SUB_ACTIVITY) {
      if(resultCode == RESULT_OK) {
        String text = data.getStringExtra("ReturnData");
        TextView textView1 = (TextView)findViewById(R.id.textView1);
        textView1.setText(text);
      }
    }
  }
  
}
解説
button1_click メソッド
ボタンがクリックされた際は下記コードでEditTextに入力された文字列を取得します。
  EditText editText1 = (EditText)findViewById(R.id.editText1);
  String text = editText1.getText().toString();

インテントのインスタンスを作成しputExtra()メソッドを呼び出しSubActivityに送る文字列を設定します。SubActivityに送る情報は先のEditTextに入力された文字列です。その後、startActivityForResult()メソッドを呼び出しSubActivityを開始します。
  Intent intent = new Intent(this, SubActivity.class);
  intent.putExtra("TestData", text);
  startActivityForResult(intent, SUB_ACTIVITY);
onActivityResult メソッド
このメソッドはアクティビティに結果が返された(リクエストコードを受け取った)時点で実行されます。

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == SUB_ACTIVITY) {
      if(resultCode == RESULT_OK) {
        String text = data.getStringExtra("ReturnData");
        TextView textView1 = (TextView)findViewById(R.id.textView1);
        textView1.setText(text);
      }
    }
  }

if(requestCode == SUB_ACTIVITY) {
}
この条件判定文により、SubActivityからのリクエストコードかを判定します。1つのアクティビティから複数種類のアクティビティを呼び出す場合にこの条件で判別をします。

if(resultCode == RESULT_OK) {
}
この条件判定文では、呼び出し先のアクティビティの終了状態を判定します。RESULT_OKは正常終了を示しています。呼び出し先のアクティビティが正常に終了した場合にのみ処理を実行します。

  String text = data.getStringExtra("ReturnData");
  TextView textView1 = (TextView)findViewById(R.id.textView1);
  textView1.setText(text);
呼び出し先のIntentオブジェクトのgetStringExtra()メソッドを呼び出し呼び出し先のアクティビティから返された値を取得します。取得した値をTextViewに表示します。

SubActivity.java

package com.iPentec.activitychange;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.widget.EditText;
import android.view.View;

public class SubActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sub);
    
    Intent intent = getIntent();
    String text = intent.getStringExtra("TestData");
    
    EditText editText1 = (EditText)findViewById(R.id.editText1);
    editText1.setText(text);
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.sub, menu);
    return true;
  }

  public void button1_click(View view){
    EditText editText1 = (EditText)findViewById(R.id.editText1);
    String text = editText1.getText().toString();

    Intent intent_ret = new Intent();
    intent_ret.putExtra("ReturnData", text);
    setResult(RESULT_OK, intent_ret);
    finish();
  }
}
解説
OnCreate
下記のコードによりインテントを取得し、呼び出しもとで設定された値を読み出しています。
  Intent intent = getIntent();
  String text = intent.getStringExtra("TestData");

EditTextのインスタンスを取得し、setTextメソッドでEditTextに値を設定します。設定する値は先のインテントから取得した値です。
  EditText editText1 = (EditText)findViewById(R.id.editText1);
  editText1.setText(text);

実行結果

プロジェクトを実行します。下図の画面が表示されます。


EditTextに文字を入力します。


入力ができたらボタンをタップします。SubActivityに切り替わりEditTextにMainActivityで入力した文字列が反映されています。


EditTextの文字列を修正します。修正後、Buttonをタップします。


MainActivityに戻ります。ボタンの下のTextViewにSubActivityで入力した文字列が表示されています。

注意

画面の向きが変わるとActivityの再構築が行われるため、TextViewの内容は初期化されてしまいます。

著者
iPentecのプログラマー、最近はAIの積極的な活用にも取り組み中。
とっても恥ずかしがり。
最終更新日: 2024-01-04
作成日: 2013-03-27
iPentec all rights reserverd.