Taka blog

プログラミングとか

[AndroidStudio4]画面を遷移させる方法、間でデータを受け渡しする方法

画面遷移には大別して2つの方法があります。今回は「Activityの切り替え」をご紹介します。ちなみに、もう1つは「Fragmentの生成」です。

新たなActivityに遷移する

起動して最初の画面について、内部処理はMainActivityに定義していました。画面とActivityは1対1で対応しています。画面を切り替えるには、現在のActivityから別のActivityを呼び出す必要があります。

MainActivity

public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.titlebar, menu);
		return true;
	}

	@Override
	public boolean onMenuItemSelected(int featureId, MenuItem item) {
		switch(item.getItemId()) {
			case R.id.button_add:
				// この2行
				Intent intent = new Intent(MainActivity.this, SubActivity.class);
				startActivity(intent);
		}
		return super.onMenuItemSelected(featureId, item);
	}
}

予め遷移先のActivityファイル(例ではSubActivity)を作成します。中身はMainActivityのデフォルトと同様(onCreateメソッドのみ実装した状態)で問題ありません。画面に対応するレイアウトも、MainActivityと同じファイルを使用しても問題ないです。

Intent生成の第1引数には遷移元のActivity、第2引数には遷移先のActivityを指定します。これらを同じActivityにして、同じActivity定義の別画面に飛ぶこともできます。

startActivityメソッドを呼ぶと、画面が切り替わります。

例の2行だけだとIntent生成をstartActivityの引数に入れて1行にできますが、データ渡しでintentに対してメソッドを呼ぶことになるので分けています。

遷移先にデータを渡す

MainActivity

Intent intent = new Intent(MainActivity.this, SubActivity.class);
intent.putExtra("test", "あ")
startActivity(intent);

遷移先にデータを渡す為に、渡す前にputExtraメソッドを使用します。第1引数にはデータの変数名、第2引数に渡すデータを指定します。

SubActivity

public class SubActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_main);
	}

	String test;
	@Override
	protected void onResume() {
		super.onResume();

		Intent intent = getIntent();
		test = intent.getStringExtra("test");
	}
}

遷移先のActivityでは、データの変数名を指定し受け取る必要があります。getIntetで受け渡されたIntetを取得し、getStringExtraでデータを取得しています。

データ取得処理を実装しているonResumeメソッドは、画面の表示時に実行されるメソッドです。「画面の表示時」には、画面の作成時と、戻るアクションによる再表示時が含まれます。onCreateメソッドは画面の作成時に呼び出されるメソッドです。

遷移先にデータを渡す&遷移元に戻る際にデータを渡す

MainActivity

	@Override
	public boolean onMenuItemSelected(int featureId, MenuItem item) {
		switch(item.getItemId()) {
			case R.id.button_add:
				Intent intent = new Intent(MainActivity.this, SubActivity.class);
				intent.putExtra("test", "あ")
				startActivityForResult(intent, 1000);
		}
		return super.onMenuItemSelected(featureId, item);
	}

	Intent back;
	String test;
	protected void onActivityResult( int requestCode, int resultCode, Intent intent) {
		super.onActivityResult(requestCode, resultCode, intent);

		if(resultCode == RESULT_OK && requestCode == 1000 && intent != null) {
			back = intent;
			test = intent.getStringExtra("test");
		}
	}

まず値を遷移先から受け取れるようにするためには、startActivityの代わりにstartActivityForResultを使用しなければなりません。

第2引数はrequestCodeという値で、この値をonActivityResultのrequestCodeと合わせることで、遷移と戻ったときの処理が紐づけられます。

onActivityResultが、遷移先から戻ったときにIntentを受け取るメソッドです。resultCodeは、遷移先で同じ値を指定してIntentをセットする必要があります。

SubActivity

	@Override
	protected void onPause() {
		super.onPause();

		Intent intent = new Intent();
		intent.putExtra("test", "い");
		setResult(RESULT_OK, intent);
	}

戻るアクションや別アプリに移動した際に呼ばれるのが、onPauseメソッドです。

遷移先では、戻るときにIntentをSetするsetResultメソッドを呼ぶ必要があります。setResultの第1引数に、前述のresultCodeを指定します。