Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
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
Tags
more
Archives
Today
Total
관리 메뉴

🌱 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 리스트를 확인할 수 있다.

신기했다🙃

 

그런데 왜 선택한 이미지 갯수만큼 로그가 나오는지는 더 확인을 해봐야 알것같다.