화면을 이동할 때는 데이터를 넘겨주는 방법이 많다.
그렇다면 화면을 이동하고 다시 돌아올 때는 데이터를 넘겨줄 수 없을까?
오늘 다룰 부분은, 이를 가능하게 하는 registerForActivityResult
이다.
MainActivity -> SongActivity로 이동하는 상황이다.
private val getResultText = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) {result ->
if (result.resultCode == Activity.RESULT_OK) {
val returnSong = result.data?.getStringExtra(STRING_INTENT_KEY)
// 받아온 앨범 제목으로 토스트 메시지 띄우기
Toast.makeText(this, returnSong, Toast.LENGTH_SHORT).show()
}
}
private fun initClickListener() {
Log.d("Song", "${songs[nowPos].title} - ${songs[nowPos].singer}")
binding.mainPlayerCl.setOnClickListener {
savedId()
val intent = Intent(this, SongActivity::class.java)
val gson = Gson()
val songJson = gson.toJson(songs[nowPos])
intent.putExtra("song", songJson)
// startActivity(intent)
// SongActivity에서 돌아올 때 받은 앨범 제목
getResultText.launch(intent)
}
}
companion object { const val STRING_INTENT_KEY = "song_key" }
돌아올 때 데이터를 전달하는, registerForActivityResult를 사용하려면 startActivity(intent) 말고 getResultText.launch(intent)를 사용해야 한다.
private fun initClickListener() {
/* 뒤로가기 버튼 */
binding.songDownIv.setOnClickListener {
sendAlbumTitle()
finish()
}
}
private fun sendAlbumTitle() { // MainActivity로 돌아갈 때 다시 데이터를 넘기는 부분
val intent = Intent(this, MainActivity::class.java).apply {
putExtra(MainActivity.STRING_INTENT_KEY, "${binding.songTitleTv.text}_${binding.songSingerTv.text}")
}
setResult(Activity.RESULT_OK, intent)
}
여기서 setResult()
부분을 주의깊게 보면 될 것 같다.
이렇게 되면 앞선 MainActivity의 registerForActivityResult
부분에 의해, setResult()
로 보낸 OK를 지녔다면 받아온 앨범 제목을 이용해 토스트 메시지를 띄울 수 있다.