단일 Activity에서 다수의 프레그먼트 사용 시 같은 Data를 이용할 경우가 많다.
프레그먼트 별로 ViewModel 객체를 생성할 경우 데이터 공유가 어렵다.
다수의 프레그먼트에서 Data를 공유해서 사용할 경우가 있다.
1개의 Activity에 2개의 Fragment가 있고, 각 Fragment는 text Data를 전송/수신한다고 할 시
Fragment1 : Text 변경 역할
Fragment2 : 수신후 보여주는 역할
ViewModel
class MyViewModel : ViewModel() {
val text = MutableLiveData<String>()
fun sendText(text: String) {
text.value = text
}
}
Fragment1
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)
binding.btn.setOnClickListener { model.sendText("Hello World") }
}
}
Fragment2
class Fragment2 : Fragment() {
// ...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val model = ViewModelProvider(requireActivity()).get(MyViewModel::class.java)
model.text.observe(viewLifecycleOwner, Observer { textView.text = it })
}
}
이 때 ViewModel 생성 시 Owner 파라미터에 this 대신 requireActivity()를 사용해야 한다.
this를 사용한다면 두 프레그먼트는 서로다른 Owner를 갖게 된다.
하지만 상위 액티비티를 Owner로 설정하는 requireActivity() 코드를 사용한다면 두 개 의 Fragment는 Owner로써 같은 Onwer (상위 Activity)를 사용하게 된다.
이와 같이 같은 Onwer를 설정해 줌으로써 Fragment 간에 데이터를 공유할 수 있다.
ViewModelProvider(requireActivity()).get(MyViewModel::class.java)
ViewModel 생성 시 같은 Owner를 전달하는 것이 핵심
ViewModel Data Share
https://jeonyt89.medium.com/
android-fragment-간-viewmodel-data-공유-39b489e8aaea
'Android > Reference' 카테고리의 다른 글
ViewPager Infinite, Auto Scroll (7) | 2022.03.08 |
---|---|
권한 체크 Permission Check (0) | 2022.02.23 |
Navigation, BottomNavigation 클릭시 Fragment 재생성 막기 (0) | 2022.02.17 |
LiveData setValue(), postValue() 차이 (0) | 2022.02.16 |
AAC (MVVM + RoomDB + RecyclerView) 실습 (0) | 2022.02.09 |