본문 바로가기

안드로이드/디자인 패턴

[Android/안드로이드]ViewModel 기본 예제

이전 게시글 :https://leehochang.tistory.com/5

 

[Android/안드로이드]DataBinding 기본 예제

1. gradle(app) android{ dataBinding{ enabled=true applyplugin:'kotlin-kapt'//코틀린 사용시 추가 } } 2. xml 으로 감싸주기 3. 코드 작성 class MainActivity : AppC..

leehochang.tistory.com

 

이전 DataBinding의 문제점을 해결할 ViewModel에 대해서 알아보겠습니다.

 

1. 필요성

viewModel 생명주기는 Activity 완전히 없어질 소멸된다.

즉, 생명주기와는 독립적인 scope를 가진다.

그래서 화면 전환 등에 따른 데이터 초기화가 일어나던 현상을 막을 있다.

 

 

 

2. gradle(app) 

dependencies {
	def lifecycle_version = "2.3.1"
    // ViewModel
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
}

 

3. xml

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/i_count_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="70sp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>

    <Button
        android:id="@+id/i_btn_increase"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="++"
        android:textSize="40sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintRight_toRightOf="parent"/>

    <Button
        android:id="@+id/i_btn_decrease"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="--"
        android:textSize="40sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 

4. viewModel 생성

class CounterViewModel : ViewModel() {
    var count : Int = 0
}

 

5. viewModel 생성 및 사용법

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val binding : ActivityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main)

        val counterViewModel : CounterViewModel by viewModels()

        binding.iCountText.text = counterViewModel.count.toString()
        binding.iBtnIncrease.setOnClickListener {
            counterViewModel.count++
            binding.iCountText.text = counterViewModel.count.toString()
        }
        binding.iBtnDecrease.setOnClickListener {
            counterViewModel.count--
            binding.iCountText.text = counterViewModel.count.toString()
        }

    }
}

viewModel의 scope는 viewModel을 가져올 때 viewModelProvider에 전달되는 lifecycle로 지정된다.

그래서 해당 lifecycle이 완전히 사라지면 viewModel의 scope로 사라진다.

 

6. 시연

생명 주기와는 독립적이기 때문에 화면 전환이 일어나도 데이터가 초기화되지 않는다