Activity의 통신과 달리 Fragment의 통신은 방법이 좀 달라진다.
이번에는 Bundle을 이용해서 Fragment끼리 통신을 해보도록 하겠다.
Fragment1
val inputName = name.text.toString()
val inputPhone = phone.text.toString()
val inputAddress = address.text.toString()
val inputProfile = uri ?: return@setOnClickListener
1. inputName, inputPhone, inputAddress은 String이고, inputProfile은 Uri형식이다.
2. 다른 Fragment로 데이터를 보내야 하는데 Uri형식으로 보낼 방법이 없다. drawable로 변환을 해서 Int형식으로 넘기든 해야하는데 parcelize를 사용해보도록하겠다.
3. parcelize를 사용하는김에 직렬화시켜서 한 묶음으로 보내는 연습을 해보자.
4. 한 묶음으로 데이터를 전송하면 각각 데이터를 전송할때보다 작업량이 감소하고 성능이 향상된다.
Gradle Scripts/build.gradle(Module:app)
plugins {
id("kotlin-parcelize")
}
5. 우선 parcelize를 사용하기 위해서 Gradle Scripts/build.gradle(Module:app)에 플러그인을 추가해주고 Sync해준다.
data class
@Parcelize
data class AddMemberData(val profile: Uri, val name:String, val phone:String, val adress:String):
Parcelable
6. 그리고 데이터클래스를 만들어 주고, @Parcelize, Parcelable을 각각 데이터클래스 앞,뒤에 써준다면 준비는 끝났다.
Fragment1 (데이터 발신)
val lesserafimList = ArrayList<AddMemberData>()
val inputName = name.text.toString()
val inputPhone = phone.text.toString()
val inputAddress = address.text.toString()
val inputProfile = uri ?: return@setOnClickListener
val lesserafim = AddMemberData(inputProfile,inputName, inputPhone,inputAddress)
lesserafimList.add(lesserafim)
Log.d("ContactProjects", "다이얼로그에서 넘기는 데이터 ${ lesserafimList}")
val bundle = Bundle()
bundle.putParcelableArrayList("FromDialog", lesserafimList)
setFragmentResult("FromDialogKey",bundle)
7. 데이터 형식에 맞게 lesserafim에 담아주고 ArrayList형식인 lesserafimList에 추가해준다.
8. val bundle = Bundle() : 매번 새로운 데이터를 Bundle에 담기위해 객체화 시켜준다.
9. bundle.putParcelableArrayList("데이터의 key값(이름표)", 넘길 데이터 리스트) 형식으로 번들에 데이터리스트를 담고
10. setFragmentResult("bundle의 key값", bundle) : 수신하는 Fragment로 데이터를 bundle과 해당 키값으로 전달한다.
Fragment2 ( 데이터 수신)
val getDialogList = ArrayList<AddMemberData>()
parentFragmentManager.setFragmentResultListener("FromDialogKey", this) { key, result ->
val getDialog = result.getParcelableArrayList<AddMemberData>("FromDialog")
Log.d("ContactProjects", "다이얼로그에서 다시 받아온 데이터 : ${getDialog}")
if(getDialog !=null){
getDialogList.addAll(getDialog)
}
}
11. parentFragmentManager.setFragmentResultListener("발신할때 쓰인 bundle의 key값 ",this)를 이용해서 다른 Fragment에서 발신한 데이터를 수신이 가능하다.
12. key와 result를 받아서 발신할때 쓰인 데이터의 key값("FromDialog")를 이용해서 변수 getDialog에 담아준다.
13. 이제그걸 ArrayList형식으로 선언된 getDialogList에 담아주면 끝났다.
14. 유의 사항은 데이터를 보내는 쪽에서 데이터를 넘기지 않았거나 널(null) 값을 보낼 수 있으므로 널체크를 해줘야한다.
LogCat(클릭해서 확대)
15. 앱을 실행시키고 위에 작성된로그 코드에 의해서 위와 같이 데이터 통신이 완료된 모습을 볼 수있다.
썸네일 출처
'TIL, WIL(일기)' 카테고리의 다른 글
230919 SearchView 억까 (0) | 2023.09.19 |
---|---|
230915 Glide : 앱 내부 갤러리에서 이미지 load 방법 (0) | 2023.09.15 |
230913 ViewPager2, TabLayout (1) | 2023.09.13 |
230912 Activity의 생명 주기& Log (1) | 2023.09.12 |
230911 연락처 앱 만들기 프로젝트를 마무리하며 (0) | 2023.09.11 |