아래 영상에서 강의로 보실 수 있습니다.
https://www.inflearn.com/course/친절한-jetpack-1?inst=3b988560
Activity에서 ViewModel Fragment에서는 ViewModel을 어떻게 사용하는지 알아보겠습니다.
기존의 계산기 예제에서, 화면을 뒤집으면 View가 새롭게 생성되면서 초기화가 되었는데, Fragment에서는 어떻게 되는지 살펴보겠습니다.
기존의 계산기 예제 처럼, Fragment에 연결해서 사용해보겠습니다.
아래와 같이 BlankFragment를 만들었고, xml파일을 아래와 같이 연결해주었습니다.
Fragment 코드에는 View가 새롭게 생성되는지에 대한 모니터링을 하기 위해서 생명주기를 알기위한 코드를 일부 추가했습니다.
아래와 같이 Fragment에 로그를 찍었습니다.
Fragment와 xml코드를 보면 아래와 같습니다.
자, 앱을 실행하면 아래와 같이 앱 화면과 로그가 찍힙니다.
자, 그러면 여기에서 화면을 뒤집어보겠습니다.
화면을 뒤집고, 전체 로그를 보니, 액티비티와 같이 view가 새롭게 생성되는 것을 볼 수 있습니다.
보나마나겠지만, 새롭게 플러스 마이너스 되는 기능을 Fragment에 구현해서 사용하면 어떻게 되는지 보겠습니다.
코드는 아래와 같이 작성하였습니다.
예상했던 것과 같이, Fragment에서도 View가 새롭게 생성되면서 값이 초기화되는 것을 볼 수 있습니다.
자, 이 문제를 해결하기 위해서 ViewModel을 사용해보겠습니다.
구글 공식문서를 보면 ViewModel에 대해서 설명할 때, Activity에서 생성한 ViewModel을 Fragment와 공유하는 것들을 설명하는데, 왜 자체적으로 ViewModel을 만들지 않는지에 대해 궁금하기 때문에, 한번 Fragment에서 Activity와 같이 뷰모델을 생성해서 해봤습니다.
Fragment 자체적인 ViewModel을 만들면 아래와 같습니다.
Only Fragment의 ViewMode
Fragment코드를 조금 간단하게 변경하고 난 이후 BlankViewModel을 생성해서 화면을 뒤집는 것을 테스트해봤습니다.
코드는 아래와 같습니다.
이렇게 테스트를 해보면 화면을 뒤집으면 값이 초기화됩니다.
왜 그런지 로그를 찍어보면 아래와 같이 나오는데
Fragment에서 ViewModel을 사용했을 때, Fragment가 Activity 라이프 사이클에 종속되어 있기 때문에, 값이 초기화 되는 문제가 발생합니다.
이 때문에,구글에서는 Activity와 Fragment의 ViewModel 공유 방식을 통해서 ViewModel 사용법을 설명하고 있습니다.
그럼 ViewModel을 Activity와 공유하는 것을 어떻게 하는지 다음글에서 한번 살펴보겠습니다!
아래 영상에서 강의로 보실 수 있습니다.
https://www.inflearn.com/course/친절한-jetpack-1?inst=3b988560
-- 참고
https://developer.android.google.cn/codelabs/kotlin-android-training-view-model#0
https://stackoverflow.com/questions/48150846/viewmodel-in-fragment-clears-values-on-screen-rotation
https://doraeul.tistory.com/43
'Android Jetpack' 카테고리의 다른 글
Android ViewModel - 5 (ViewModel Factory) (0) | 2021.12.24 |
---|---|
Android ViewModel - 4 (Activity Fragment ViewModel 공유) (0) | 2021.12.22 |
Android ViewModel - 2 (Activity ViewModel) (0) | 2021.12.18 |
Android ViewModel - 1 (ViewModel의 필요성) (0) | 2021.12.18 |
Android View에 대한 접근 - 4 (Databinding with DataClass) (0) | 2021.12.15 |