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( 省略 )