본문 바로가기
컴퓨터/안드로이드

[안드로이드] 인텐트로 객체 전달하기/Parcelize사용하여 인텐트로 전달

by 도도새 도 2022. 6. 24.

인텐트로 객체 전달

 

안드로이드에서 인텐트는 여러가지 상황에 쓰인다. 그 중 대표적인 것이 한 화면에서 다른 화면으로 넘어갈 떄 쓰일 수 있다.

게다가 putExtra 등의 메서드를 이용해 인텐트에 값을 담아 전달하는 것 역시 가능하다.

그런데, 내가 만든 클래스의 객체를 인텐트의 데이터로 전달 가능할까?

 

결론부터 말하자면 가능하다. 이를 위해 (코틀린의 경우) Parcelize를 사용하게 된다.

*Intent의 생성자들 형태

Intent()

Intent(Intent I)

Intent(String action, [,Uri uri])

Intent(Context packageContext, Class<?> cls)

Intent(String action, Uri uri, Context packageContext, Class<?> cls)

 

 

1. 인텐트 환경 설정

 

 parcelize와 화면 전환 인텐트를 사용하기 위해 manifest와 플러그인(module)을 건들여 줘야한다.

 

1. plugins

플러그 인에 id 'kotlin-parcelize'를 추가한다.

 

2. manifest

manifest파일에 위와 같이 서브 액티비티를 등록한다.

 

2. 데이터 클래스 만들기

 

 데이터를 담는 클래스를 만들 것이다. 

간단한 이름과 나이를 받는 데이터 클래스이며, 간단한 구현을 위해 둘 다 String으로 구현하였다.

1
2
3
4
5
6
7
8
9
10
package com.example.intentpractice_pacerable
 
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
 
@Parcelize
data class PersonData(
    var name:String?,
    var age:String?
): Parcelable
cs

 

6 : @Parcelize 어노테이션을 달아준다

 

8 : Null값을 허용

 

10 :Parcelable을 작성

 

3. xml파일 생성

 

 작업을 보여주기 위한 간단한 xml 파일을 작성하였다.

<activity_main.xml>

(코드)

더보기

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">
 
 
    <Button
        android:id="@+id/btn_main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
 
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintBottom_toTopOf="@+id/btn_main"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:gravity="center">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="이름 : "/>
        <EditText
            android:id="@+id/name"
            android:layout_width="100dp"
            android:layout_height="wrap_content"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="나이 : "/>
        <EditText
            android:id="@+id/age"
            android:layout_width="100dp"
            android:layout_height="wrap_content"/>
 
    </LinearLayout>
 
 
</androidx.constraintlayout.widget.ConstraintLayout>
cs

버튼과 텍스트뷰 에딧텍스트를 만든다

에딧 텍스트에 사용자가 입력하는 정보를 바탕으로 객체를 생성할 예정

 

<activity_sub.xml>

(코드)

더보기

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">
 
    <Button
        android:id="@+id/btn_sub"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
 
    <TextView
        android:id="@+id/textView_sub"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btn_sub" />
 
</androidx.constraintlayout.widget.ConstraintLayout>
cs

 

버튼 하나와 텍스트뷰 하나를 만든다

텍스트 뷰에는 후에 받아온 객체의 정보들을 띄울 예정

 

4.  MainActivity.kt

 

메인 액티비티에서는 인텐트를 이용해 PersonData클래스의 객체를 SubActivity로 넘기는 작업을 한다.

 

버튼을 클릭하면 EditText의 내용이 객체로 생성되며 SubActivity로 넘어간다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.example.intentpractice_pacerable
 
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
 
val REQUEST_CODE = 100
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
        val btn:Button = findViewById(R.id.btn_main)
        val name:EditText = findViewById(R.id.name)
        val age:EditText = findViewById(R.id.age)
 
        btn.setOnClickListener {
            var intent:Intent = Intent(this, SubActivity::class.java)
            var data = PersonData(name.text.toString(), age.text.toString())
            intent.putExtra("data", data)
            startActivityForResult(intent, REQUEST_CODE)
        }
    }
 
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
 
        if(requestCode == REQUEST_CODE){
            Toast.makeText(this"OnActivityResult 호출 : ${requestCode}", Toast.LENGTH_SHORT).show()
        }
    }
}
cs

 

21 : 화면 전환 역할을 하는 인텐트 생성

 

22 : 사용자로 부터 입력받은 값으로 PersonData 객체 생성

 

23 : 인텐트에 data객체 삽입

 

28~ : 서브 클래스에서의 결과에 따라 발동하는 영역

 

5. SubActivity

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.example.intentpractice_pacerable
 
import android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
 
class SubActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sub)
        val btn:Button = findViewById(R.id.btn_sub)
        val textView:TextView = findViewById(R.id.textView_sub
        )
        var intent:Intent = getIntent()
        var data1:PersonData? = intent.getParcelableExtra<PersonData>("data")
 
        textView.setText("이름 ${data1?.name} 나이 ${data1?.age}")
        Toast.makeText(this"전달된 데이터\n" +
                "이름 ${data1?.name} 나이 ${data1?.age}", Toast.LENGTH_SHORT).show()
 
        btn.setOnClickListener {
            setResult(RESULT_OK, intent)
            finish()
        }
    }
}
 
cs

 

17 : 인텐트를 받아옴

 

15 : "data"라는 이름으로 넘겨온 <PersonData>의 객체를 data1에 저장

 

20, 21 : data1 객체의 멤버 변수 출력

 

24 : 버튼 클릭시 새 액티비티를 끝냄

 


결과:

 

 

댓글