Activity間のデータのやり取り

■準備

事前準備として以下の手順を実行して下さい。

①.プロジェクト作成
	新規プロジェクト「ActivityTransitionData」をEmptyActivityで作成します。

②.HelloWorld削除
	作成後はProjectウィンドウのres/layout/activity_main.xmlを
	クリックしてXMLを表示してHello WorldのTextViewタグを削除します。

③.ボタン配置
	「Design」タグをクリックし、Widgets => Buttonを選択し、
	画面上のどこでもいいのでボタンを配置します。

④.PlainTextViewを配置
	Paletteの「PlainTextView」を画面のどこでもいいので配置します。
	※PropertiesのtextSizeを24に変更して下さい。

⑤.OnClickListenerをMainActivityに継承する
	「MainActivity.java」ファイルを開き、「OnClickListener」を継承します。
	※1.継承ではimplementsを使用します。
	※2.android.view.View.OnClickListenerをimportします。

⑥.onClick関数を実装する
	ボタンをクリックした際に動作するようにonClick関数を実装します。

		@Override
		public void onClick(View v)
		{
			switch (v.getId())
			{
			case R.id.button:
				break;
			}
		}

	mb_0063

⑦.遷移用Activity作成
	遷移用のEmptyActivity「SubActivity」を作成します。
	
⑧.ボタン配置
	activity_sub.xmlの「Design」タグをクリック後、Widgets => Buttonを
	選択して画面上のどこでもいいのでボタンを配置します。

⑨.PlainTextViewを配置
	Paletteの「PlainTextView」を画面のどこでもいいので配置します。
	※PropertiesのtextSizeを24に変更して下さい。

⑩.OnClickListenerをSubActivityに継承する
	「SubActivity.java」ファイルを開き、「OnClickListener」を継承します。
	※1.継承ではimplementsを使用します。
	※2.android.view.View.OnClickListenerをimportします。

⑪.onClick関数を実装する
	ボタンをクリックした際に動作するようにonClick関数を実装します。

	@Override
	public void onClick(View v)
	{
	}

	mb_0064

■仕様

●アプリ仕様
	・各画面のボタンを押せば画面が遷移する
	・遷移回数を遷移先に伝えて画面上で表示する

●遷移方法
	遷移はIntentを使用して行う

■遷移元 => 遷移先への送受信方法

●送信方法
	遷移元から遷移先へデータを送信するにはIntentクラスの
	「putExtra」関数を使用します。
			
	Intent putExtra(string, ある程度の型は設定可能):
		戻り値:
			Intent:このIntentクラスのインスタンス
			
		引数:
			string:
				送信先へ伝えるデータの名称

			いくつもの型:
				第二引数はある程度の型に対応できるように
				複数のオーバーロード関数が作成されています。

		内容:
			遷移先のActivityへの送信データに名前を付けて
			データを登録する
	
		例:
			Intent intent = new Intent(MainActivity.this, SubActivity.class);
			// m_TransitionCountをTransitionCountという名前で登録する
			intent.putExtra("TransitionCount", m_TransitionCount);
			startActivity(intent);

		putExtra関数を使用することでインテントに送信データを登録し、
		受信先で取得できるようになります。

●受信方法
	遷移先からデータを取得する際は「startActivityForResult関数」と
	「onActivityResult関数」「get~Extra」を使用します。

	void startActivityForResult(Intent, int):
		戻り値:
			なし
	
		引数:
			Intent:
				起動するアクティビティ情報が入ったインテント
		
			int:
				アクティビティ終了時にonActivityResultに渡される値
	
		内容:
			インテントの情報を使用してアクティビティを起動する
			その際に起動したアクティビティが終了した時に呼び出される
			onActivityResultに渡される引数としてint型の値を設定します。
			この値を設定する理由としてアクティビティが起動させる
			アクティビティの数は1つではないので、
			どのアクティビティの終了時の情報を受け取るのかを判断する
			必要があり、そのための判断材料として使用します。
				
		例:
			Intent intent = new Intent(MainActivity.this, SubActivity.class);
			m_RequestCode = 100;
			startActivityForResult(intent, m_RequestCode);

	void onActivityResult(int, int, Intent)
		戻り値:
			なし
		
		引数:
			int:
				startActivityForResultで設定した値
		
			int:
				終了結果の値(遷移先のアクティビティが設定を行う)
		
			Intent:
				終了したインテント
		
		内容:
			onActivityResultはオーバーライド関数で、
			遷移先のアクティビティが終了した際に遷移元で呼び出される関数です。
			この関数の引数としてアクティビティ起動時の設定値、
			終了結果、終了したインテントが渡されるので、
			それらの内容を使用し、情報を取得します。

		例:
			@Override
			protected void onActivityResult(int requestCode, 
							int resultCode,
							Intent intent) 
			{
				super.onActivityResult(requestCode, resultCode, intent);

				if (requestCode == m_RequestCode && intent != null)
				{
				}
			}

	get~Extra(string, 初期値)
		戻り値:
			インテントのデータ
		
		引数:
			string:
				インテントに登録されているデータの名前
				※putExtraで登録しているもの

			初期値:
				getIntExtraやgetFloatExtraなど基本的なデータ型は
				取得できなかった際の初期の設定が必要
				※初期値を必要としないものもある
		
		内容:
			get~Extraはインテントに登録されているデータを取得するための関数です。
			getとExtraの間にはIntやStringなどのデータ型名を指定し、
			その型が戻り値の型として使用されます。
			取得に必要な情報はputExtraで登録を行ったデータの名前です。
			この名前を指定することと、関数名でデータ型を指定することで
			データの取得が可能となります。

		例:
			// インテントに登録されているTransitionCountという名前のintデータを取得
			int transition_count = intent.getIntExtra("TransitionCount", 0);

■サンプルコード

package com.example.yottomo.activitytransitiondata;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity 
					implements OnClickListener 
{
	private int m_TransitionCount;  // 遷移回数
	private int m_RequestCode;      // アクティビティ登録コード

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// ボタン登録
		findViewById(R.id.button).setOnClickListener(this);

		m_TransitionCount = 0;
		m_RequestCode = 0;

		// テキストの更新
		UpdateTextView();
	}

	// テキスト内容の更新
	private void UpdateTextView()
	{
		// テキストビューの内容更新
		TextView text = (TextView)findViewById(R.id.textView);
		text.setText("遷移回数:" + m_TransitionCount + "回");
	}

	@Override
	public void onClick(View v)
	{
		switch (v.getId())
		{
		case R.id.button:
			Intent intent = new Intent(MainActivity.this, SubActivity.class);
			m_TransitionCount++;
			m_RequestCode = 100;
			intent.putExtra("TransitionCount", m_TransitionCount);
			startActivityForResult(intent, m_RequestCode);
			break;
		}
	}

	@Override
	protected void onActivityResult( int requestCode, int resultCode, Intent intent) 
	{
		super.onActivityResult(requestCode, resultCode, intent);

		if (requestCode == m_RequestCode && intent != null)
		{
			// 遷移回数取得
			m_TransitionCount = intent.getIntExtra("TransitionCount", 0);

			// テキストの更新
			UpdateTextView();
		}
	}
}

■遷移先 => 遷移元への送受信方法

●受信方法
	遷移元から遷移先へのデータ受信するには「get~Extra関数」と「getIntent関数」を
	使用しますが「get~Extra関数」は「■遷移元 => 遷移先への送受信方法」の
	「●受信方法」で説明していますのでこちらでの説明は省きます。

	Intent getIntent()
		戻り値:
			アクティビティクラスの保持するインテント
	
		引数:
			なし
		
		内容:
			ActivityクラスはIntentクラスをprivateのメンバとして持っており、
			startActivityで起動された際に使用されたIntentが設定されます。
			そのインテントを取得するのがこのgetIntent関数です。
		
		例:
			Intent intent = getIntent();
			int transition_count = getIntExtra("TransitionCount", 0);

●送信方法
	遷移先から遷移元へデータを送信するには「putExtra関数」「setResult関数」を使用します。
	「putExtra関数」は「■遷移元 => 遷移先への送受信方法」の「送信方法」で
	説明していますので、こちらでの説明は省きます。

	setResult
		戻り値:
			なし
	
		引数その1:
			int:終了コード
				成功:RESULT_OK
				キャンセル:RESULT_CANCELED
				オリジナルID:RESULT_FIRST_USER以上の値
			
		引数その2:
			int:終了コード
				成功:RESULT_OK
				キャンセル:RESULT_CANCELED
				オリジナルID:RESULT_FIRST_USER以上の値
		
			Intent:
				送信データを登録したインテント

		内容:
			アクティビティの終了状態と送信データの設定を行う
			送信データの登録を行ったインテントを設定する

		例:
			getIntent().putExtra("TransitionCount", m_TransitionCount);
			setResult(RESULT_FIRST_USER, getIntent());
			finish();

■サンプルコード

package com.example.yottomo.activitytransitiondata;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class SubActivity extends AppCompatActivity 
				implements View.OnClickListener 
{
	private int m_TransitionCount;  // 遷移回数

	@Override
	protected void onCreate(Bundle savedInstanceState) 
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_sub);

		// ボタン登録
		findViewById(R.id.button2).setOnClickListener(this);

		// インテントから遷移回数情報を取得
		Intent intent = getIntent();
		m_TransitionCount = intent.getIntExtra("TransitionCount", 0);

		UpdateTextView();
	}

	// テキスト内容の更新
	private void UpdateTextView()
	{
		// テキストビューの内容更新
		TextView text = (TextView)findViewById(R.id.textView2);
		text.setText("遷移回数:" + m_TransitionCount + "回");
	}

	@Override
	public void onClick(View v)
	{
		switch(v.getId())
		{
		case R.id.button2:
			// 遷移回数を追加して終了
			m_TransitionCount++;
			getIntent().putExtra("TransitionCount", m_TransitionCount);
			setResult(RESULT_OK, getIntent());
			finish();
			break;
		}
	}
}