본문 바로가기

Study/Android

[Android] Fragment 간 ViewModel Data 공유

단일 액티비티에서 다수의 프레그먼트 사용시 같은 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