🌱 dreaming DiNO
[Kotlin] EventBus 이용하여 Activity로 받은 data → Fragment로 전달하여 받기 본문
Android/Android Studio
[Kotlin] EventBus 이용하여 Activity로 받은 data → Fragment로 전달하여 받기
MK_____ 2022. 5. 13. 17:27💡 Fragment 에서 갤러리 이미지 다중 선택하여 Uri Data 얻을 필요성
: 갤러리를 Intent로
1. gradle 추가
//EventBus
implementation 'org.greenrobot:eventbus:3.2.0'
2. 갤러리 사진 선택 띄우기
// 사진 추가 버튼
binding.addPhotoBtn.setOnClickListener {
// CropImage.activity()
// .start(requireContext(), this)
// 갤러리 다중이미지 선택 띄우기
val intent = Intent(Intent.ACTION_PICK)
intent.type = MediaStore.Images.Media.CONTENT_TYPE
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true) // 다중 이미지 true
intent.data = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
startActivityForResult(intent, 100)
//activity?.startActivityForResult(intent, 100)
}
3. 선택된 데이터는 Fragment가 붙어있는 Activity로 Data가 간다
오버라이드 함수 구현해서 data 확인
여기서 이 data → Fragment로 전달하기위해
data class ImageEvent 만들어서 거기에 data 담고
EventBus 코드 추가하여 전달
data class ImageEvent(
var requestCode: Int,
var resultCode: Int,
var data: Intent?
){
constructor() : this(0,0, null)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
Log.d("MemoDebug", "MainActivity::onActivityResult-()")
Log.d("MemoDebug", "MainActivity::requestCode: $requestCode, resultCode: $resultCode, data: $data")
Log.d("MemoDebug", "MainActivity:: data?.clipData: ${data?.clipData}")
EventBus.getDefault().post(ImageEvent(requestCode, resultCode, data))
}
4. 이 전달한 data를 받아야 하므로, 받을 곳인 Fragment 에서 EventBus 를 받겠다고 선언해줘야 함
이벤트를 받겠다고 등록
Fragment가 사라질때 이벤트를 해지하겠다고 해줌
5. 전달 받을 data를 처리해주는 함수 선언 및 정의
@Subscribe(threadMode = ThreadMode.MAIN)
fun onMessageEvent(event: ImageEvent?) {
Log.d("MemoDebug", "DetailFragment::onMessageEvent-()")
event?.let {
//onActivityResult(it.requestCode, it.resultCode, it.data)
Log.d("MemoDebug", "DetailFragment:: imageEvent: $event")
var clipData = event.data?.clipData
var uriList = arrayListOf<Uri>()
clipData.let {
for (i in 0 until clipData!!.itemCount) {
val imageUri: Uri = clipData.getItemAt(i).uri // 선택한 이미지들의 uri를 가져온다.
try {
uriList.add(imageUri) //uri를 list에 담는다.
Log.d("MemoDebug", "uriList=> $uriList")
} catch (e: Exception) {
Log.d("MemoDebug", "e=> $e")
}
}
}
}
}
실제로 함수가 불리지 않았는데 @Subscribe로 어노테이션 등록해서 그런지 로그로 uri 리스트를 확인할 수 있다.
신기했다🙃
그런데 왜 선택한 이미지 갯수만큼 로그가 나오는지는 더 확인을 해봐야 알것같다.
'Android > Android Studio' 카테고리의 다른 글
[Kotlin] [문제해결] Firebase 구글로그인 화면전환 안될 때 SHA-1 확인 적용방법 (0) | 2022.07.22 |
---|---|
[Kotlin] [에러해결] Gson TypeConverter 시 Null 처리 (Nullable coulmn 추가) (0) | 2022.05.16 |
[Kotlin] Room db Migration 방법 + Gson 이용해 다양한 타입 데이터 저장하기 (0) | 2022.05.12 |
[Kotlin] Null vs Empty vs Blank (0) | 2022.05.12 |
[Kotlin] Glide 라이브러리 사용법 (0) | 2022.02.09 |