본문 바로가기
Kotlin

[Kotlin/코틀린] Android Intent 사용법2 / 다른 액티비티에 데이터 전달하기

by IGBR 2022. 3. 1.

지난 포스팅엔 Intent를 사용하여 화면 전환과 더불어 액티비티 스택 관리에 대해서 정리하였습니다. 

https://no1msh1217.tistory.com/13

 

[Kotlin/코틀린] Android Intent 사용법1 / 다른 액티비티로 이동하기

한 화면에 모든걸 다 표시하는 정도의 간단한 앱이 아니라면 다른 액티비티로 이동은 필연적인 요소입니다. 간단하게 다른 액티비티로 이동하는 방법을 알아봅시다. 1. 기본 사용법 val 인텐트이

no1msh1217.tistory.com

 

이번에는 Intent를 사용하여 다른 액티비티로 이동할 때 데이터를 전달하는 방법에 대해서 정리해보겠습니다. 


A Activity -> B Activity

- 데이터가 단방향으로만 전달 되는 형태

1. 기본사용법

- A Activity

val 인텐트이름 = Intent(this , 전달할액티비티이름 :: class.java)
인텐트이름.putExtra("데이터의 이름표" , 준비해둔데이터 )
startActivity(인텐트이름)

 

- B Activity

val 변수이름 = intent.getStringExtra("전달했던 데이터의 이름표")
텍스트뷰변수.text = 변수이름

 

2. 사용해보기

- EditText에 문자를 입력하고 Button을 누르면 데이터를 가지고 인텐트를 통해 다른 액티비티로 이동하는 프로젝트입니다.

 

- MainActivity.kt (데이터를 가지고 전달해줄 액티비티)

package com.example.kotlinintentindependentstudy2

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        btnSendText.setOnClickListener {

            val message = edtSendText.text.toString() 
            // 버튼이 눌리면 EditText에 있는 내용 저장

            val textSendIntent = Intent(this , SecondActivity :: class.java)
            // 인텐트 생성

            textSendIntent.putExtra("message", message) // .putExtra() 메소드로 데이터 전달준비

            startActivity(textSendIntent) // 인텐트 실행
        }
    }
}

 

- SecondActivity (데이터를 받을 액티비티)

package com.example.kotlinintentindependentstudy2

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_second.*

class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        val message = intent.getStringExtra("message")
        // intent.getStringExtra("전달했던 데이터의 이름표")

        txtReceive.text = message // TextView에 message 표현
    }
}

 

A Activity -> B Activity -> A Activity

- A에서 시작하여 B에서 데이터를 가지고 다시 A로 복귀하는 형태

 

1. 기본 사용법

- A Activity

val 인텐트이름 = Intent(this, 이동할액티비티이름 :: class.java)
startActivityForResult(인텐트이름, 리퀘스트코드) // 리퀘스트코드는 정수로 들어갑니다.

 

- B Activity 

val 인텐트이름 = Intent() // 단순 데이터를 담는 용도라 출발지 / 도착지 명시가 필요 없습니다.
인텐트이름.putExtra("전달할 데이터 이름표" , 전달할데이터)
setResult(RESULT_OK, 인텐트이름)
finish() // 액티비티를 종료합니다.

 

- A Activity 추가 코드 (다시 A Activity로 돌아올 때를 대비한 코드 , onCreate() 바깥에 작성해야 합니다.)

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

        if (requestCode == 리퀘스트코드이름){

            if (resultCode == Activity.RESULT_OK) {

                val 변수이름 = data?.getStringExtra("전달받은 데이터의 이름표")
                값을나타낼텍스트뷰.text = 변수이름

            }
        }
    }

2. 사용해보기

- 수정하기 버튼을 누르면 수정을 해주는 액티비티로 이동하고 , 닉네임을 수정한 후 다시 액티비티를 돌아오면 닉네임이 수정된 모습으로 나타나는 프로젝트입니다. (닉네임 수정 프로젝트)

 

- MainActivity (닉네임이 표시됩니다.)

        btnModifyText.setOnClickListener {
            val modifyIntent = Intent(this, ModifyActivity::class.java)
            
            startActivityForResult(modifyIntent, REQ_CODE_NICKNAME)
        }

- REQ_CODE_NICKNAME 은 멤버 변수로 선언해 줍니다. 

- 원래 숫자로 표현되나 코드의 가독성을 위해 , 그리고 이 숫자가 무엇을 의미하는지를 위해 멤버 변수로 선언하는걸

추천합니다.

 

- ModifyActivity ( EditText로 수정하고 싶은 닉네임을 받아 Button을 누르면 다시 MainActivity로 넘겨줄 Activity입니다.)

        btnSubmitText.setOnClickListener {
            val nickname = edtModifyText.text.toString()

            val modifyIntent = Intent()

            modifyIntent.putExtra("nickname", nickname)

            setResult(RESULT_OK, modifyIntent)

            finish()
        }

 

- MainActivity ( onActivityResult( ) 구현 ) 

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

        if (requestCode == REQ_CODE_NICKNAME) {
            if (resultCode == RESULT_OK) {
                txtNickname.text = data?.getStringExtra("nickname")
            }
        }
    }

 


세줄 요약

1. A Activity -> B Activity로 데이터를 전달하는 구조는 인텐트이름.putExtra( ) 메소드 사용 

2. A Activity -> B Activity -> A Activity로 데이터를 가지고 오는 구조는 StartActivityForResult( ) 사용

3. 돌아오고 나서 데이터를 관리해줄 땐 onActivityResult( ) 구현

 

위에서 사용한 예제

https://github.com/no1msh/KotlinIntentIndependentStudy2

 

GitHub - no1msh/KotlinIntentIndependentStudy2: 다른액티비티에서 수정한후 돌아오면서 데이터를 가지고오

다른액티비티에서 수정한후 돌아오면서 데이터를 가지고오는 Intent. Contribute to no1msh/KotlinIntentIndependentStudy2 development by creating an account on GitHub.

github.com

다음엔 Intent로 다른 기본 앱으로 이동에 대해 포스팅하겠습니다!

댓글