badazim’s blog

素人がプログラミングを勉強しながら覚え書きを書きます

kotlinでstartActivityForResultで別画面からデータを受け渡して戻ってくる

<遷移元(MainActivity)側の実装>

MainActivityから別画面へ遷移する際にstartActivityForResultへ変更する。2つめの引数は後述するOnActivityResultで遷移元画面を判断するためのコード値(requestCode)になっている。

ToOrderChange.setOnClickListener {

 (省略)

val intent = Intent(this, OrderChange2::class.java)
intent.putExtra("PlayerOrder",PlayOrderArray)
intent.putExtra("PointOrder",PlayOrderPoint)
//startActivity(intent)
startActivityForResult(intent,9)
}

 

startActivityForResultをoverrideする。とりあえず"9"以外のrequestCodeはありえないため、処理をしない。その上で戻るボタンではない(resultCode == Activity.RESULT_OK)場合で、null許容のIntent型のdataがnull出ない場合だけ処理してみる。

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)

if(requestCode != 9) { return}

if (resultCode == Activity.RESULT_OK && data != null) {
val resultArray:Array<String>? = data.getStringArrayExtra("playOrder")
val pointArray:Array<String>? = data.getStringArrayExtra("pointOrder")
if (resultArray != null && pointArray != null){

       (処理は省略)

}

} else if(resultCode == Activity.RESULT_CANCELED) {
textView0_A.text = "戻るボタン"
}
}

 

<遷移遷移先(2つめのActivity)側の実装>

もともとstartActivityだったところをsetResultとfinish()で置き換えて実装できた。

Restart.setOnClickListener {
val intent = Intent(this,MainActivity::class.java)
val update_resultArray = arrayOf(
省略 )
val update_pointArray= arrayOf( 省略 )
intent.putExtra(
"playOrder",update_resultArray)
intent.putExtra(
"pointOrder",update_pointArray)

setResult(Activity.
RESULT_OK, intent)
finish()
//startActivity(intent)
}

 

ちなみにここで配列がnullになってしまい1時間はまった。

val resultArray:Array<String>? = data.getStringArrayExtra("playOrder")
val pointArray:Array<String>? = data.getStringArrayExtra("pointOrder")

 

遷移先(ここではMainActivity側)のgetStringArrayExtraの使い方に問題があるものと思い込んだけど実際には遷移元(2つめのActivity)側でputExtraするときの配列の定義がarrayListofを使っていたので、arrayList型になっていただけだった。android studioがちゃんと型を表示してくれているので、ちゃんと確認するようにしよう。。。

val update_resultArray = arrayListOf( 省略 )
val update_pointArray= arrayListOf( 省略 )