개발 공부/Android / / 2022. 8. 7. 22:41

[Android Kotlin] registerForActivityResult() 구현

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

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유