JUnitについての書籍が遂に発売します!
Java開発時のユニットテストを加速する「JUnit速効レシピ」
Java開発時のユニットテストを加速する「JUnit速効レシピ」
Androidアプリ開発では、沢山のActivityが登場し、
画面遷移もある程度の規模になると複雑化します。
そして、一つのActivity内だけで簡潔できる範疇を超えてくると、
Activity間での値の受け渡しが必須となります。
今回は、そんなActivity間の値の受け渡し方法として、
遷移元から遷移先へ値を渡す方法と、遷移先での値の受け取り方。
遷移先から遷移元へ値を返却する方法をサンプルコード付きで解説します。
遷移先への値の渡し方と受け取り方
Intentによる画面遷移では、遷移先のActivityを指定してIntentを作成し、
『startActivity()』メソッドにてActivityを開始します。
その際、Activityを開始させる前にIntentへ値を保持させる事で、遷移先へ値を渡す事が可能です。
遷移先では、渡されてきた値を受け取るというよりも、起動に利用されたIntentの中にある値を取得するイメージです。
Intentを値の一時保管場所として、値を保持出来れば遷移先からもIntent内の値を取得する事が出来るといった考え方です。
Intentへ値を保持させるには『putExtra()』メソッドを使用しましょう。
// 遷移先のactivityを指定してintentを作成 Intent intent = new Intent( this, MyActivity.class ); // intentへ添え字付で値を保持させる intent.putExtra( "name", "hamada" ); // 指定のActivityを開始する startActivity( intent );
MyActivityへ遷移させる為にIntentを作成し、intentクラスの『putExtra()』メソッドを起動します。
『putExtra()』メソッドの第一引数には、識別する為のキーを指定し、第二引数に渡したい値を指定します。
第一引数のキーは文字列である必要がありますが、第二引数は型の制限はありません。
ただ、型については値を取得する時に考慮する必要があります。
まずは上記の例の場合、MyActivityでの値の取り方を下記に示します。
// 現在のintentを取得する Intent intent = getIntent(); // intentから指定キーの文字列を取得する String name = intent.getStringExtra( "name" );
遷移先では、『getIntent();』メソッドにて現在のintentを取得できますので、
取得した現在のintentに対し、『getStringExtra();』メソッドにて引数に指定したキーに対する文字列を取得します。
ここで型の考慮が必要になります。
今回の例ですと、保管されている値は『hamada』という文字列ですので、『getStringExtra();』メソッドを使用しました。
同様に、数値の場合や、真偽値の場合では取得に用いるメソッドが異なります。
値の型毎に用意されている取得メソッドは下記の一覧の通りです。
真偽値の配列(boolean[]) | getBooleanArrayExtra( "キー" ) |
---|---|
真偽値(boolean) | getBooleanExtra( "キー" , デフォルト値 ) |
バンドル(Bundle) | getBundleExtra( "キー" ) |
バイト配列(byte[]) | getByteArrayExtra( "キー" ) |
バイト(byte) | getByteExtra( "キー" , デフォルト値 ) |
文字配列(char[]) | getCharArrayExtra( "キー" ) |
文字(char) | getCharExtra( "キー" , デフォルト値 ) |
文字シーケンス配列(CharSequence[]) | getCharSequenceArrayExtra( "キー" ) |
文字シーケンスの配列(ArrayList | getCharSequenceArrayListExtra( "キー" ) |
文字シーケンス(CharSequence) | getCharSequenceExtra( "キー" ) |
浮動小数点数配列(double[]) | getDoubleArrayExtra( "キー" ) |
浮動小数点数(double) | getDoubleExtra( "キー" , デフォルト値 ) |
浮動小数点数配列(float[]) | getFloatArrayExtra( "キー" ) |
浮動小数点数(float) | getFloatExtra( "キー" , デフォルト値 ) |
整数配列(int[]) | getIntArrayExtra( "キー" ) |
整数(int) | getIntExtra( "キー" , デフォルト値 ) |
整数オブジェクトの配列(ArrayList | getIntegerArrayListExtra( "キー" ) |
整数配列(long[]) | getLongArrayExtra( "キー" ) |
整数(long) | getLongExtra( "キー" , デフォルト値 ) |
オブジェクトの一時的保管領域配列(Parcelable[]) | getParcelableArrayExtra( "キー" ) |
オブジェクトの一時的保管領域配列( | getParcelableArrayListExtra( "キー" ) |
オブジェクトの一時的保管領域( | getParcelableExtra( "キー" ) |
シリアライズ(Serializable) | getSerializableExtra( "キー" ) |
整数配列(short[]) | getShortArrayExtra( "キー" ) |
整数(short) | getShortExtra( "キー" , デフォルト値 ) |
文字列配列(String[]) | getStringArrayExtra( "キー" ) |
文字列配列(ArrayList | getStringArrayListExtra( "キー" ) |
文字列(String) | getStringExtra( "キー" ) |
全て添え字指定にて値を識別し、取得しますが
該当する添え字が無い場合、基本的にはnullが返却されます。
上記一覧内のメソッドの中には、第二引数にデフォルト値を指定出来るものがあり、
そのようなメソッドでは、キーに該当するものが無い場合はデフォルト値が返却されます。
もちろん、第二引数に指定するデフォルト値も、メソッドに該当する型である必要があります。
遷移元への値の渡し方と受け取り方
遷移先のActivityが『finish()』にて終了する際に、遷移元へ値を渡すには
遷移させる方法から意識する必要があります。
通常では、遷移先のActivityを元にIntentを作成し、
『startActivity()』メソッドにてActivityを開始しますが、
返却値を意識したActivityの起動時には、『startActivity()』の代わりに『startActivityForResult()』を使用します。
// 遷移先のactivityを指定してintentを作成 Intent intent = new Intent( this, MyActivity.class ); // 遷移先から返却されてくる際の識別コード int requestCode = 1001; // 返却値を考慮したActivityの起動を行う startActivityForResult( intent, requestCode );
通常のActivity起動方法との違いは、起動時に『startActivityForResult()』を用いる事です。
『startActivityForResult()』の第一引数にはintentを指定し、
第二引数には、どの遷移先からの返却値なのかを判断する為の識別コードを
独自に指定します。
次に、返却値を受け取るメソッドを実装しましょう。
返却値を受け取るには、『onActivityResult()』を実装します。
public void onActivityResult( int requestCode, int resultCode, Intent intent ) { // startActivityForResult()の際に指定した識別コードとの比較 if( requestCode == 1001 ){ // 返却結果ステータスとの比較 if( resultCode == Activity.RESULT_OK ){ // 返却されてきたintentから値を取り出す String str = intent.getStringExtra( "key" ); } } }
第一引数からは『startActivityForResult()』の第二引数で指定した識別コードが取得でき、
第二引数からは後述の遷移先から渡される結果ステータスを取得出来ます。
第三引数は、値を格納する為のintentで、遷移先へ渡すのと同じように『putExtra()』にて格納されていますので、
該当する値の型を考慮したメソッドにて、キーを元に取得します。
それらの情報を元に、まずはどのリクエストに対するレスポンスなのかを判断し、
結果が成功か否か等のステータスを判断した後に、
渡されて来た値を使って処理をするというのが一般的です。
続いて、『finish();』する側、値を送り返す遷移先側の実装を見てみましょう。
// intentの作成 Intent intent = new Intent(); // intentへ添え字付で値を保持させる intent.putExtra( "key", "result_val" ); // 返却したい結果ステータスをセットする setResult( Activity.RESULT_OK, intent ); // アクティビティを終了させる finish();
値の格納方法は、遷移先へ値を渡す方法と同じ様に、intentを作成して
『putExtra()』にて値を保持させます。
そして、結果セットとして返却する(onActivityResultへ送り返す)値を
『setResult()』にて指定します。
第一引数には結果ステータスを。第二引数には引き渡したい値を保持したintentです。
後は、特にスタートさせるActivityも無いので、そのまま『finish()』して下さい。
Activityを『finish()』させる事で、呼び出し元の『onActivityResult()』メソッドが起動されます。
これで、遷移先へ値を渡す事が出来、渡されて来た値を受け取る事も出来る。
遷移先から遷移元へコールバックの様な形で値を返却する事が出来る用になりました。
Androidアプリ開発では、複数のActivityを介して
様々な値をやり取りしますので、基本的な値の引渡し方法として念頭に置いて頂ければ幸いです。
実際、値の引渡しには専用の共通クラスを用意したり、サービスを利用するなど
intentを利用した方法以外にも存在します。
そういった別の扱い方は、別の機会に解説したいと思います。
まずは基本中の基本となるintentの扱いを身に着けて頂ければ幸いです。
JUnitについての書籍が遂に発売します!
Java開発時のユニットテストを加速する「JUnit速効レシピ」
Java開発時のユニットテストを加速する「JUnit速効レシピ」