#1 개요
#1-1 Data Binding과 ViewModel
데이터 바인딩을 이용해 View에 객체를 보낼 수 있었다. 그렇다면, ViewModel의 객체 또한 같은 방식으로 보낼 수 있을 것이다.
#1-2 ViewModel이 쓰인 샘플 앱
위 게시글의 완성된 앱을 토대로 코드를 수정한다.
#2 View에 객체(ViewModel) 전달
#2-1 activity_main.xml에서 <variable> 태그 추가 및 활용
<?xml version="1.0" encoding="utf-8"?>
<layout ...>
<data>
<variable
name="myViewModel"
type="com.example.viewmodeltoview.MainActivityViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout ...>
<Button
android:id="@+id/countButton"
...
android:onClick="@{()->myViewModel.updateCount()}"
... />
...
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
본 프로젝트에서 사용할 <variable>을 등록한다. 이제 Activity로부터 전달받은 MainActivityViewModel을 참조할 수 있게 되었으므로, MainActivityViewModel.updateCount() 메소드를 View에서 호출할 수 있다. <Button>에 android:onClick 속성을 부여하고, 그 값에는 해당 메소드를 데이터 바인딩 표현식과 람다 표현식을 활용해 넣어준다.
#2-2 MainActivity.kt에서 View에 ViewModel 전달하기
...
class MainActivity : AppCompatActivity() {
...
override fun onCreate(savedInstanceState: Bundle?) {
...
binding.myViewModel = viewModel // activity_main.xml의 'myViewModel'에 MainActivityViewModel의 객체 'viewModel' 넣기
viewModel.count.observe(this, Observer {
binding.countText.text = it.toString()
})
/*
binding.countButton.setOnClickListener {
viewModel.updateCount()
}
*/
}
}
먼저, View에서 정의했던 <variable>인 viewModel에 MainActivityViewModel의 객체를 전달해야 한다. 이렇게 ViewModel이 전달된 순간부터, 아까 ID값이 "countButton"인 <Button>에 정의했던 android:onClick 속성이 정상작동한다. 따라서, MainActivity에서 View 요소의 클릭리스너를 할당하는 코드는 이제 필요가 없다. 해당되는 필요없는 코드를 주석으로 만들었다 제거해버렸다. 추가로, 코드 중 viewModel.count.observe( ... )의 제거 또한 가능하다.
#3 요약
View에서 직접 View Model을 참조할 수 있게 만든다.
#4 완성된 앱
'깨알 개념 > Android' 카테고리의 다른 글
[Android] LiveData - 양방향 데이터 바인딩의 3가지 방법 (0) | 2024.01.20 |
---|---|
[Android] LiveData - 암시적으로 '관찰'하기 (0) | 2024.01.19 |
[Android] LiveData - 기초 (0) | 2024.01.16 |
[Android] ViewModel - 뷰 모델에 인자(Argument) 전달 (ViewModelFactory) (0) | 2024.01.15 |
[Android] ViewModel - 기초 (0) | 2024.01.13 |