안드로이드에서 개발을 하다 보면, Activity간에 데이터를 주고받아야 할 때가 많다.
그 중에서도 이미지를 하나의 액티비티에서 다른 액티비티로 전달하는 것을 배웠다.
Intent를 사용하여 이미지 데이터를 ImageView로 전달하는 방법을 단계별로 정리해보겠다.
(1) Intent Activity 한눈에 보기
구현할 동작은 다음과 같다.
- Activity Intent1 -> Activity Intent2로 이미지를 보낸다.
- Intent1에서 TextView를 클릭하면 Intent2의 ImageView로 uri가 전달된다.
URI(Uniform Resource Indentifier)요?
: 자원을 나타내는 고유한 주소를 뜻한다.
- Intent 데이터 전달시 uri 형태여야 함.
- Indentifier : 식별자, id
(2) Activity 구현하기
코드는 아래와 같다.
2-1. Intent1
class Intent1 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_intent2)
ViewCompt.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
// 명시적 인텐트 + 이미지 uri 전달
(findViewById<TextView>(R.id.explicit_intent_action)).apply {
this.setOnClickListener {
val intent = Intent(this@Intent1, Intent2::class.java).apply {
val imageUri =
Uri.parse("android.resource://" + packageName + "/drawable/" + "pg")
this.action = Intent.ACTION_SEND
this.putExtra(Intent.EXTRA_STREAM, imageUri)
this.setType("image/*")
}
startActivity(intent)
}
}
}
}
2-1. Intent2
package com.example.fastcampus_ktc
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.os.Parcelable
import android.util.Log
import android.widget.ImageView
import android.widget.TextView
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
class Intent2 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_intent2)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
val imageView = findViewById<ImageView>(R.id.imageView)
val uri = Uri.parse(
intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM).toString()
)
imageView.setImageURI(uri)
}
}
2-3. 결과 화면
결과는 다음과 같다.
Intent2로 보자면 원래 <ImageView>화면은 초록색 바탕이다.
Intent1에서 클릭을 하면 Intent2로 화면 전환이 되면서 (내가 좋아하는) 펭귄 사진이 뜬다.
(3) 문제 : 'getParcelableExtra(String!): T?' is deprecated.
Intent2의 해당 메소드 삭제됐다.
아직까지는 getParcelableExtra를 사용할 수 있기는 한데, 그래도 공식문서를 찾아봤다.
https://developer.android.com/sdk/api_diff/t-beta2-incr/changes/android.content.Intent
android.content.Intent
Class android.content.Intent Removed Fields String EXTRA_NEW_UID String EXTRA_PREVIOUS_UID String EXTRA_UID_CHANGING
developer.android.com
Changed Methods -> T getParcelableExtra(String)
Added Methods -> T getParcelableExtra(String, Class<T>)
인자에 클래스를 추가해야하는 메소드로 바뀌었다.
새로운 API 메서드를 사용하면, 반환 타입을 명확히 지정할 수 있기 때문에 컴파일 타임에 타입 검사를 통해 오류를 방지할 수 있다.
수정된 Intent2의 getParcelableExtra 코드는 다음과 같다.
val imageView = findViewById<ImageView>(R.id.imageView)
val uri: Uri? = intent.getParcelableExtra(Intent.EXTRA_STREAM, Uri::class.java)
uri?.let {
imageView.setImageURI(it)
}
정리해보자.
- Intent를 사용한 데이터 전달
Intent를 사용하여 액티비티 간 데이터를 주고받는 방법을 배웠다.
특히 Intent.ACTION_SEND와 EXTRA_STREAM을 사용하여 이미지 URI를 전달한다. - getParcelableExtra 메서드getParcelableExtra(String) 메서드가 deprecated 되었다
-> 대신 getParcelableExtra(String, Class<T>) 메서드를 사용하여 타입 안전성을 보장할 수 있다.
'2024 활동 > Kotlin·Android' 카테고리의 다른 글
[Android] HeaderBar 가려짐 해결 (1) | 2024.05.29 |
---|---|
[Android Studio] 빌드 오류 해결 intent-filter (0) | 2024.05.08 |
[Kotlin] 인터페이스 이해하기 (0) | 2024.04.28 |
[Kotlin] 클래스 심화 : 상속, 오버라이딩, 형변환, 스마트 캐스트 (0) | 2024.04.18 |
[Kotlin] Null Safety 예제로 쉽게 이해하자! (0) | 2024.04.18 |