반응형

ViewModel

설명

  • 안드로이드는 Activity 생명주기를 갖고 있고, 화면 회전과 같은 동작에서 Activity가 초기화 되면서 데이터도 함께 초기화되는 현상이 발생한다.
  • 따라서 화면 회전과 같은 동작 발생시 그에 따른 데이터 유지를 개발자가 직접 코딩으로 해결해야 한다.
  • 생명 주기 상관 없이 앱이 살아있는 동안 데이터를 유지시켜주는 것이 ViewModel

코드

build.gradle
dependencies {
    ...
    implementation "androidx.activity:activity-ktx:1.1.0" // by viewModels()로 ViewModel 생성을 위해 추가
}
MainActivityViewModel
class MainActivityViewModel : ViewModel() {
    val count = MutableLiveData<Int>()
    val text = MutableLiveData<String>()

    init {
        count.value = 1
        text.value = "Hello World"
    }

    fun increaseCount(value: Int) {
        count.value = count.value?.plus(value)
    }
}
MainActivity
class MainActivity : AppCompatActivity() {
    lateinit var binding: ActivityMainBinding
    private val model: MainActivityViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater).apply {
            setContentView(root)
            lifecycleOwner = this@MainActivity
            model = this@MainActivity.model
        }

        model.count.observe(this, Observer {
            Toast.makeText(this@MainActivity, "count : ${it}", Toast.LENGTH_SHORT).show()
        })
    }
}
res/layout/activity_main.xml
  • @{data} : 데이터를 get만 하는 표현식
  • @={data} : 데이터를 get, set 모두 하는 표현식
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="model"
            type="com.example.android_example.MainActivityViewModel" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@={model.text}" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{model.text}" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{`count : ` + model.count}" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{() -> model.increaseCount(1)}"
            android:text="increase" />
    </LinearLayout>
</layout>

참고

반응형

'Development > Android' 카테고리의 다른 글

[Android] Notification  (0) 2021.02.09
[Android] Application  (0) 2021.02.09
[Android] LiveData  (0) 2021.02.09
[Android] DataBinding  (0) 2021.02.09
[Android] kotlin-android-extensions  (0) 2021.02.09

+ Recent posts