Android Jetpack

Android ViewModel - 3 (Fragment에서 사용)

----___<<<<< 2021. 12. 18. 22:12

아래 영상에서 강의로 보실 수 있습니다.

 

https://www.inflearn.com/course/친절한-jetpack-1?inst=3b988560 

 

[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin) - 인프런 | 강의

코틀린으로 안드로이드 개발을 위한 젯팩(JETPACK) 개론입니다. 안드로이드 개발을 하면서 사용할 수 있는 다양한 테크닉을 연습할 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

 

 Activity에서 ViewModel Fragment에서는 ViewModel을 어떻게 사용하는지 알아보겠습니다.

 

 기존의 계산기 예제에서, 화면을 뒤집으면 View가 새롭게 생성되면서 초기화가 되었는데, Fragment에서는 어떻게 되는지 살펴보겠습니다. 

 

 기존의 계산기 예제 처럼, Fragment에 연결해서 사용해보겠습니다.

 

 아래와 같이 BlankFragment를 만들었고, xml파일을 아래와 같이 연결해주었습니다.

 

 Fragment 코드에는 View가 새롭게 생성되는지에 대한 모니터링을 하기 위해서 생명주기를 알기위한 코드를 일부 추가했습니다.

 

 

https://developer.android.com/guide/fragments/lifecycle

 

 아래와 같이 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 

 

[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin) - 인프런 | 강의

코틀린으로 안드로이드 개발을 위한 젯팩(JETPACK) 개론입니다. 안드로이드 개발을 하면서 사용할 수 있는 다양한 테크닉을 연습할 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

 

 

 -- 참고

 

https://developer.android.google.cn/codelabs/kotlin-android-training-view-model#0

 

Android Kotlin Fundamentals: 5.1 ViewModel  |  Android Developers

In this codelab, you learn how to use ViewModel to enable data to survive configuration changes such as screen rotations in your Android Kotlin app.

developer.android.google.cn

 

https://stackoverflow.com/questions/48150846/viewmodel-in-fragment-clears-values-on-screen-rotation

 

ViewModel in fragment clears values on screen rotation

Guess I'm missing something obvious here but... I'm storing data in uiModel in the DiaryViewModel class, and since I use architecture components I'm expecting the data to be retained through screen

stackoverflow.com

 

https://doraeul.tistory.com/43

 

savedInstanceState 란?

Activity의 onCreate함수는 다음과 같다. public void onCreate(Bundle savedInstanceState) { 도대체 savedInstanceState 란 뭘까? 이것이 왜 필요할까? 화면이 세로모드에서 가로모드로 전환 시 onCreate함수가..

doraeul.tistory.com