[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を指定します。