단일 액티비티에서 다수의 프레그먼트 사용시 같은 Data를 이용할 경우가 많다. 프레그먼트 별로 ViewModel 객체를 생성할 경우 데이터 공유가 어렵다.
해결방법
다수의 프레그먼트에서 Data를 공유해서 사용할 경우가 있다.
1개의 Activity에 2개의 Fragment가 있고, 각 Fragment는 Message Data를 전송/수신 한다고 하자.
Fragment1 : Message 전송 역할 ( Data 업데이트 )
Fragment2 : Message 수신후 보여주는 역할 ( Data 변화 감지 )
ViewModel, Fragment1, Fragment2 코드는 아래와 같다.
class MyViewModel : ViewModel() {
val message = MutableLiveData<String>()
fun sendMessage(text: String) {
message.value = text
}
}
class Fragment1 : Fragment() {
lateinit var model: MyViewModel
//...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
model = ViewModelProvider(requireActivity()).get(MyViewModel::class.java)
button.setOnClickListener { model.sendMessage("MindOrks") }
}
}
class Fragment2 : Fragment() {
// ...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val model = ViewModelProvider(requireActivity()).get(MyViewModel::class.java)
model.message.observe(viewLifecycleOwner, Observer { textViewReceiver.text = it })
}
}
이 때 ViewModel 생성 시 Owner 파라미터에 ‘this’ 대신 ‘requireActivity()’ 를 사용하자. ‘this’를 사용한다면 두 프레그먼트는 서로다른 Owner를 갖게 된다. 하지만 상위 액티비티를 Owner로 설정하는 requireActivity() 코드를 사용한다면 두 개 의 Fragment는 Owner로써 같은 Onwer (상위 액티비티)를 사용하게 된다.
이와 같이 같은 Onwer를 설정해 줌으로써 Fragment 간에 데이터를 공유할 수있다.
ViewModelProvider(requireActivity()).get(MyViewModel::class.java)
Key-Poinrt
ViewModel 생성시 같은 Onwer를 전달하는 것이 키포인트다.
참조 https://jeonyt89.medium.com/android-fragment-간-viewmodel-data-공유-39b489e8aaea
Referenced by
https://blog.mindorks.com/shared-viewmodel-in-android-shared-between-fragments
'Study > Android' 카테고리의 다른 글
[Android/Kotlin] ViewPager2 - Infinite Loop (0) | 2022.04.12 |
---|---|
[Android][스크랩] Fragment에서 Back Key Event 처리 (0) | 2022.04.01 |
[Android] Coroutine, Retrofit을 활용한 비동기 네트워킹 처리 중 에러 핸들링 (0) | 2022.03.16 |
JSON to Kotlin class 플러그인 으로 데이터 클래스 생성하기 (0) | 2022.03.11 |
FragmentStateAdapter (0) | 2022.03.07 |