Activity에서 결과를 가져오는 콜백함수로 기존의 startActivityForResult() 와 onActivityResult()가 deprecated 되고 새롭게 나온 것이 registerForActivityResult()라고 한다.
순서는 이렇다.
A activity -> B activity -> A activity
1. A activity 에 콜백 등록
if (result.resultCode == RESULT_OK) {
값이 왔을 때 실행할 코드
}
val getResult = registerForActivityResult(
ActivityResultContracts.StartActivityForResult())
{ result: ActivityResult ->
if (result.resultCode == RESULT_OK) {
val bResult = result.data?.getStringExtra("결과값")!! //B activity에서 종료시에 보낸 결과값
Toast.makeText(context, "값이 왔다$bResult", Toast.LENGTH_SHORT).show()
}
}
lateinit을 이용해 사용하고 싶다면
private lateinit var getResult: ActivityResultLauncher<Intent>
2. 실행하기
A activity에서 버튼을 눌러서 B activity로 가도록 하는 부분에 넣어준다. 위에서 만든 ActivityResultLauncher객체를 이용해서 launch 실행
getResult.launch()
val intent = Intent(this, EditActivity::class.java)
intent.putExtra("accountId",pageViewModel.accountOb.accountId)
intent.putExtra("groupId",pageViewModel.accountOb.groupId)
getResult.launch(intent)
실제 적용 코드
toolbar에 있는 메뉴를 통해서 이동하는 경우에서 사용함. 수정부분
//Toolbar 메뉴 클릭 이벤트
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
android.R.id.home -> { //뒤로 가기 버튼
finish()
}
R.id.detail_update->{//수정
val intent = Intent(this, EditActivity::class.java)
intent.putExtra("accountId",pageViewModel.accountOb.accountId)
intent.putExtra("groupId",pageViewModel.accountOb.groupId)
getResultText.launch(intent)
//startActivity(intent)
}
R.id.detail_delete->{//삭제
val deleteCheckDialog = AlertDialog.Builder(this)
deleteCheckDialog.setTitle("삭제") //다이얼로그 알림창 명
deleteCheckDialog.setMessage("정말 삭제하시겠습니까?") //전달할 메세지
deleteCheckDialog.setPositiveButton("삭제", DialogInterface.OnClickListener { dialog, which ->
pageViewModel.deleteThisAccountData(accountId = accountId)
finish()
})
deleteCheckDialog.setNegativeButton("취소",null)
deleteCheckDialog.show()
}
}
return super.onOptionsItemSelected(item)
}
3. B activity에서 결과 보내기
보낼 데이터가 있다면 intent를 통해서 A activity로 보내면 된다. 위에서 결과값을 받을 키를 "결과값"으로 했기 때문에 같은 키로 적어준다
(1번의 코드 val bResult = result.data?.getStringExtra("결과값")!!)
val mIntent = Intent(this,DetailActivity::class.java).apply {
putExtra("결과값",accountId) //A activity로 보낼 값
}
setResult(RESULT_OK, mIntent)
finish()
'개발 공부 > Android' 카테고리의 다른 글
[Android Kotlin]RecyclerView Adapter 내외부 ClickListener 구현하기(onClick, LongClick) (0) | 2022.08.10 |
---|---|
[Android] RecyclerView Item Ripple Effect(리플 적용하기) (0) | 2022.08.09 |
[Android] EditText 읽기 전용으로 만들기 (0) | 2022.08.06 |
[Android] EditeText password 보이기/숨기기 토글 (1) | 2022.08.04 |
[Android Kotlin] RecyclerView Animation Transition 구현하기 (0) | 2022.08.03 |