[Android] Intent로 Activity, Data 전달하기/받기
1. main xml에서 '다른 화면으로 이동'이라는 버튼을 누르면 OtherActivity와 연결
2. main xml에서 메세지를 입력하고 '메세지를 다른 화면으로 전달'이라는 버튼을 누르면 MessageActivity와 연결
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp"
tools:context=".MainActivity">
<Button
android:id="@+id/moveToOtherBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="다른 화면으로 이동"/>
<EditText
android:id="@+id/messageEdt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="전달할 메세지 입력"/>
<Button
android:id="@+id/messageMoveToOtherBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="메세지를 다른 화면으로 전달"/>
</LinearLayout>
MainActivity.kt
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.eunjeong.intent.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var viewBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(viewBinding.root)
// 화면 간 이동 (OtherActivity)
viewBinding.moveToOtherBtn.setOnClickListener {
//다른 화면으로 이동
//Intent(출발지, 도착지)
val myIntent = Intent(this, OtherActivity::class.java)
startActivity(myIntent)
}
// 메세지 전달 (MessageActivity), 밑에서 다시 다룰 예정 지금은 넘어가기
viewBinding.messageMoveToOtherBtn.setOnClickListener {
val myIntent = Intent(this, MessageActivity::class.java)
//입력한 내용 변수에 저장
val inputMessage = viewBinding.messageEdt.text.toString()
// putExtra(데이터 이름표, 내용)
myIntent.putExtra("message", inputMessage)
startActivity(myIntent)
}
}
}
Intent는 출발지, 도착지를 써야하는데 출발지는 this, 도착지는 이동할 Activity를 쓰면 된다.
변수(myIntent)로 받아서 Intent를 작성해줬다.
val myIntent = Intent(this, OtherActivity::class.java)
Intent를 성공적으로 작동하려면 마지막에 이 코드를 꼭 써줘야 한다.
startActivity(myIntent)
activity_other.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="20dp"
tools:context=".OtherActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="다른 화면으로 들어온 상태입니다."/>
<Button
android:id="@+id/moveToPrevBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="이전 화면으로 돌아가기"/>
</LinearLayout>
OtherActivity.kt
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.eunjeong.intent.databinding.ActivityMainBinding
import com.eunjeong.intent.databinding.ActivityOtherBinding
class OtherActivity : AppCompatActivity() {
private lateinit var viewBinding: ActivityOtherBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewBinding = ActivityOtherBinding.inflate(layoutInflater)
setContentView(viewBinding.root)
viewBinding.moveToPrevBtn.setOnClickListener {
// val myIntent = Intent(this, MainActivity::class.java)
// startActivity(myIntent)
finish() // 지금 화면 꺼주세요
// 넘어갈때는 intent 되돌아갈때는 finish 활용
}
}
}
메인 화면에서 다른 화면으로 넘어왔을 때, 다시 되돌리고 싶어서 버튼을 추가해줬다.
위에서 한 것처럼 Intent(출발지, 목적지)로 되돌리면 Activity가 계속 쌓인다.
그렇기 때문에 finish()를 써줬다.
즉, 넘어갈 때는 intent, 되돌아갈 때는 finish를 활용
activity_message.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp"
tools:context=".MessageActivity">
<TextView
android:id="@+id/recievedMessageTv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="메세지 띄우겠습니다."
android:gravity="center"
android:textSize="20sp"/>
</LinearLayout>
MessageActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.eunjeong.intent.databinding.ActivityMessageBinding
class MessageActivity : AppCompatActivity() {
private lateinit var viewBinding: ActivityMessageBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewBinding = ActivityMessageBinding.inflate(layoutInflater)
setContentView(viewBinding.root)
// 이 화면에 들어올 때 첨부된 데이터를 텍스트뷰에 반영
// val 받아줄변수 = intent.get자료형Extra("데이터이름표")
val intentMessage = intent.getStringExtra("message")
viewBinding.recievedMessageTv.text = intentMessage
}
}
MainActivity에서 보낸 메세지를 MessageActivity로 받으려고 한다.
MainActivity.kt 코드 중 일부를 해당 부분만 보면, 다음과 같다.
// 메세지 전달 (MessageActivity)
viewBinding.messageMoveToOtherBtn.setOnClickListener {
val myIntent = Intent(this, MessageActivity::class.java)
//입력한 내용 변수에 저장
val inputMessage = viewBinding.messageEdt.text.toString()
// putExtra(데이터 이름표, 내용)
myIntent.putExtra("message", inputMessage)
startActivity(myIntent)
}
-------------------------------------------------------------------------------------------------------
Text를 보낼 때에도 Activity 전환이 필요하기 때문에 Intent를 쓴다.
그리고 이제 여기에 Text도 저장해서 "같이" 보내면 된다.
우선, 변수(inputMessage)에 EditText에 입력한 내용을 저장하고,
보낼 Intent에 putExtra 메소드로 데이터 이름표와 내용을 보내면 된다.
(데이터 이름표는 내가 구분할 수 있으면 상관없고 내용은 변수를 써주었다.)
그리고 마지막으로는 위에서 강조한 startActivity(myIntent) 쓰면 된다.
-------------------------------------------------------------------------------------------------------여기까지 MainActivity에서 할 내용
-------------------------------------------------------------------------------------------------------
여기까지 했을 때 버튼을 누르면 Activity는 전환이 되지만 내용은 전달되지 않을 것이다.
받는 과정을 구현하지 않았기 때문!!!
받는 과정은 MessageActivity에서 구현하면 된다.
// 이 화면에 들어올 때 첨부된 데이터를 텍스트뷰에 반영
// val 받아줄변수 = intent.get자료형Extra("데이터이름표")
val intentMessage = intent.getStringExtra("message")
viewBinding.recievedMessageTv.text = intentMessage
받아줄 변수에 intent(이건 소문자로 써야함).get자료형Extra("아까 내가 붙인 데이터 이름표")를 저장해준다.
마지막으로 이 변수를 ActivityMessage.xml TextView의 text를 .text 메소드를 통해 대입하여 바꿔준다.
-------------------------------------------------------------------------------------------------------여기까지 MessageActivity에서 할 내용
코드는 깃허브에 올렸다.
https://github.com/Eundding/android_study/tree/master/Intent
GitHub - Eundding/android_study
Contribute to Eundding/android_study development by creating an account on GitHub.
github.com