안드로이드 스튜디오 LiveData로 Fragment간 데이터 전달(with Kotlin)

Purang·2023년 3월 19일
0

카테고리를 구현하던 도중 interface와 직접적으로 전달하는 방법을 전부 실패하고 다른 방법을 찾던 중 성공한 방식 liveData 입니다..

액티비티나, 프레그먼트, 서비스 등과 같은 안드로이드 컴포넌트의 생명주기(Lifecycle)를 인식하며 그에따라 LiveData는 활성상태(active)일때만 데이터를 업데이트(Update) 합니다.
-> 자세한 내용은 공부한 블로그에서!

build.gradle에 dependencies를 추가합니다.

implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

SharedViewModel

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가 완전히 생성되었음을 보장합니다.)

  • 따라서,
    1) 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 변수에 값을 저장하여 반영한 것을 확인할 수 있었습니다.


참조 블로그 1
참조 블로그 2
참조 블로그 3

profile
몰입의 즐거움

0개의 댓글