질문(예시)
1. BoardWriteFragment 와 DonateWriteFragment 파일에서 각각
imageButtonBoardWrite.setOnClickListener {
mainActivity.replaceFragment(MainActivity.GALLERY_FRAGMENT, true, null)
}
이미지 선택 버튼을 누르면, MainActivity.GALLERY_FRAGMENT 으로 이동 하는 코드가 있다고 한다면, MainActivity.GALLERY_FRAGMENT으로 이동 해서 MainActivity.GALLERY_FRAGMENT 에 있는 이미지를 선택하는 기능을 사용해서 돌아오고싶습니다.
이때, BoardWriteFragment 와 DonateWriteFragment 중 어느 곳에서 이미지 선택 버튼을 눌러서 MainActivity.GALLERY_FRAGMENT 가 작동하였는지 구분을 어떻게 하는지 싶어서 질문드렸습니다.
즉, BoardWriteFragment 에서 버튼을 눌렀을때, MainActivity.GALLERY_FRAGMENT 에서는 BoardWriteFragment 가 눌렀음을 인지해서, 선택된 이미지를 다시
BoardWriteFragment 으로 전달을 하게 하고 싶습니다.
화면캡쳐(예시)
위 질문에 해당하는 질문의 링크나 스크린샷을 여기에 추가해 멘토분들이 참고할 수 있도록 하세요.
프로젝트 주소
멘토 답변
Fragment에서 결과를 주고 받는 방법에 대해서 알아보았습니다.
1.
Fragment Result API
fragment-ktx 라이브러리에서 제공해주는 기능이며, FragmentManager를 통해 값을 observe 구조로 받을 수 있음을 설명드렸고, 직접 실습하는 시간을 가졌습니다.
장점
•
FragmentManager에서 리스너를 등록하고, 값을 자유롭게 설정할 수 있어 Fragment가 서로 모르는 상태로 개발을 진행할 수 있습니다. (의존성이 없는 유연한 구조)
단점
•
값을 bundle로만 넘겨 받아야 하기 때문에 큰 용량의 데이터를 넘기는 것에 어려움이 있습니다. 그래서 Bitmap 처럼 큰 데이터를 넘기는 것이 불가능할 수 있습니다.
cc. Bundle Size
하지만 오히려 Bitmap을 넘기지 않고 Image의 Url 또는 Id 등을 넘겨 받는 구조가 좀 더 좋은 구조임을 설명드렸습니다.
2.
ActivityViewModel 사용
ViewModel을 공유할 수 있는 방법에 대해서 설명드렸습니다. Fragment에서 Activity의 LifecycleOnwer를 넘기면서 동일한 Activity 내에 동일한 ViewModel 인스턴스를 참조할 수 있음을 설명드리며 해당 방법을 통해 값을 직접 공유할 수 있음을 설명드렸습니다.
장점
•
클래스 자체가 공유되다보니까 bundle 보다 좀 더 큰 데이터들을 공유할 수 있다는 장점이 있습니다.
단점
•
비슷한 기능을 개발할 때마다 공유하고자 하는 Activity ViewModel class가 계속 늘어나는 구조라서 기능이 복잡해질 수록 프로젝트 구조가 복잡해질 수 있습니다.
(추가질문) BoardWriteFragment에서 FireStore에 업로드하는 방식을 MVVM으로 바꾸고 싶어요
BoardWriteFragment 클래스 내에 존재하던 Firebase 업로드 코드를 data layer인 Repository에 옮기면서, ViewModel에서 LiveData를 사용해 observe 패턴으로 뷰와 통신하는 예제 코드를 설명드렸습니다.