마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Activity 에서 Fragment 로 drawble 데이터 전달

0 추천
Activity 에서 SubActivity 에 있는 Fragment 로 drawble 데이터 전달할 때 drawble 을 bundle 에 담아 인텐트로 SubActivity 에 보내주고 이를 SubActivity 에서 val bundle = intent.getBundleExtra 를 통해 꺼내어 다시 번들로 Fragment 로 보내주려하는데

val bitmap = this.arguments?.getParcelable<Bitmap>(key:~) 로 전달받으니 자꾸 null 이 담겨 옵니다.

Fragment 로 drawble 데이터 전달 받으려면 어떻게 해야 할까요?
stark(스타크) (250 포인트) 님이 2022년 2월 25일 질문
관련 코드를 올려보세요.
코드를 올리면 글이 안올라가져서 답변에 남겼습니다!

4개의 답변

+1 추천

bundle이 맵타입이라고 말씀드렸는데, dataSize = 24라는 건 bundle 안에 24가지의 데이터가 저장되어 있다는 말인데요. Intent에서 bundle를 꺼낼 때 "first"키로 꺼냈는데, 이 bundle에서 다시 "first"키로  bitmap을 꺼내고 계셔서 이상해 보여요. 프레그먼트의 arguments에서  bitmap을 꺼낼 때는 bitmap을 저장했던 키값으로 접근을 하셔야 할 것 같은데, 그렇게 하고 계시지 않은 것 같이 보여요.

아래처럼 처리하셔야 하는게 아닌가 싶어요.
 

val bundle = intent.getBundleExtra("first")
val bitmap = bundle.getParcelable<Bitmap>("bitmp키값") // =>  여기서 bitmap을 먼저 꺼내야할 듯.
val settingsFragment = SettingsFragment()
settingsFragment.arguments = bundleOf("first" to bitmap)

 

spark (227,470 포인트) 님이 2022년 2월 27일 답변
원래 처음에는 MainActivity 에서 bitmap 을 bundle 로 담을 때의 키값과 bundle 을 intent 로 담을 때의 키 값을 둘 다 first 로 했었는데 다음과 같이 수정하고
---
bundle.putParcelable("bitmap", firstImageBitmap)
intent.putExtra("bundle", bundle)
---
SubActivity 에서
---
val bundle = intent.getBundleExtra("bundle")
val bitmap = bundle?.getParcelable<Bitmap>("bitmap")
Log.d("test2", bundle.toString())
---
로 로그를 찍어봤는데 이번에는 Bundle[{bitmap = null}]  로 들어오네요 그래도 뭔가 바꼈습니다!
그나저나 매번 너무 친절히 답해주셔서 항상 감사합니다 스파크님..!
스파크님 다른 방법으로 해결했습니다. 처음엔 drawable 파일을 보내야 하니 당연히 bitmap 으로 바꾸어 그 자체를 보내야 한다고 생각했는데 생각해보니 drawable 의 R.drawable. 이렇게 이름지어진 int값을 넘겨주어 해당 drawable 파일을 띄워줄 것 같아서 putInt 로 해서 Int 를 주고 받는 방식으로 해결했습니다...!
근데 해결은 했지만 한 가지 궁금한게 여기서도
---
val bundle = intent.getBundleExtra("firstIntent")
Log.d("test2", bundle.toString())
---
로 찍어봤을 때
test2: Bundle[mParcelledData.dataSize=40] 로 dataSize 가 40이 나오는데 int 값 하나를 보냈는데 왜 dataSize 가 40이 나올까요?
네. drawableId가 이용가능하다면 그게 맞습니다. bitmap을 바로 넘기는 경우는 일반적이지는 않습니다.
그리고 bundle을 그대로 arguments로 보냈기 때문에 bundle 에 기본적으로 들어있던 데이터까지 같이 넘어갔을 겁니다. 구체적으로 어떤 데이터인지는 브레이크 포인트를 설정하셔셔 mParcelledData를 디버깅해서 확인하시기 바랍니다. 디버깅을 해보시면 훨씬 명료하게 아실 수 있습니다.
그리고 bundle에 넘길 수 있는 데이터는 사이즈 제한이 있습니다. 정확하게 기억을 나지 않지만 상황에 따라 1MB와 500KB였던 걸로 기억합니다. 따라서 너무 큰 데이터는 bundle로 넘기지 않는게 안전합니다. bitmap같은 경우는 파일로 저장하거나 해서 공유하는게 좋을 것 같습니다.
정말 감사합니다 spark 님!!
0 추천

MainActivity 입니다.

image

stark(스타크) (250 포인트) 님이 2022년 2월 26일 답변
stark(스타크)님이 2022년 2월 27일 reshown
0 추천

SubActivity 입니다

image

stark(스타크) (250 포인트) 님이 2022년 2월 26일 답변
0 추천

Fragment 입니다

image

stark(스타크) (250 포인트) 님이 2022년 2월 26일 답변
val bundle = intent.getBundleExtra("first")
여기에서 bundle에 어떤 값이 넘어오는지 확인해 보셨나요?
D/test2: Bundle[mParcelledData.dataSize=24]
이렇게 넘어옵니다!
dataSize = 24 네요. 이 부분이 의심스럽네요. bundle안에 "first"키에 해당하는 데이터가 존재하고 Bitmap 타입인지. 여기서 에러가 안난다면 Fragment 쪽에서도 똑같이 디버깅을 해보세요. 이런 데이터를 디버깅하실 때는 출력보다는 브레이크포인트를 설정하고 변수값을 확인하신게 좋을 것 같네요. 참고로 bundle은 맵형태의 데이터 타입입니다.
dataSize 가 24 면 비정상적인 건가요?
...