카테고리를 구현하던 도중 interface와 직접적으로 전달하는 방법을 전부 실패하고 다른 방법을 찾던 중 성공한 방식 liveData 입니다..
액티비티나, 프레그먼트, 서비스 등과 같은 안드로이드 컴포넌트의 생명주기(Lifecycle)를 인식하며 그에따라 LiveData는 활성상태(active)일때만 데이터를 업데이트(Update) 합니다.
-> 자세한 내용은 공부한 블로그에서!
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
class SharedViewModel : ViewModel() {
private val liveData = MutableLiveData<String>()
fun getLiveData(): LiveData<String> {
return liveData
}
fun setLiveData(str: String) {
liveData.value = str
}
}
새로운 class를 만들어 줍니다.
전달하고 싶은 내용을 먼저 set시켜줄 A-fragment로 와서
//viewmodel
private var sharedViewModel: SharedViewModel? = null
//livedata
sharedViewModel!!.setLiveData(et.text.toString())
...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
sharedViewModel = ViewModelProvider(requireActivity())[SharedViewModel::class.java]
}
위 코드로 데이터를 set해줍니다. 저는 dialog의 확인 버튼을 눌렀을 때 카테고리이름을 set하도록 하였습니다.
onViewCreated()는 onCreateView()를 통해 반환된 View 객체가 onViewCreated()의 파라미터로 전달된다.
onViewCreated() 에서부터 Fragement View의 lifecyele이 INITIALIZED 상태로 업데이트 된다.
(Fragment View가 완전히 생성되었음을 보장합니다.)
2) LiveData observing
3) RecyclerView나 ViewPager2에 사용될 Adatper 세팅등을 해줄 수 있습니다.
이제 데이터를 받을 B-fragment로 와서
private var sharedViewModel: SharedViewModel? = null
...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
sharedViewModel = ViewModelProvider(requireActivity()).get(SharedViewModel::class.java)
val testObserver = androidx.lifecycle.Observer<String> { textValue ->
categoryName = textValue
}
sharedViewModel!!.getLiveData().observe(viewLifecycleOwner, testObserver)
}
데이터를 받아와 categoryName 변수에 값을 저장하여 반영한 것을 확인할 수 있었습니다.