깨알 개념/Android

[Android] ViewModel - View에 객체(ViewModel) 전달

interfacer_han 2024. 1. 18. 18:33

#1 개요

#1-1 Data Binding과 ViewModel

 

[Android] Data Binding - View에 객체 전달

#1 객체 전달의 필요성 #1-1 이전 글 Data Binding - 기초 #1 데이터 바인딩 사용 전 #1-1 예시 앱 위과 같은 간단한 앱이 있다. Button을 누르면, EditText의 text가 바로 위에 있는 TextView의 text에 대입된다. 이

kenel.tistory.com

데이터 바인딩을 이용해 View에 객체를 보낼 수 있었다. 그렇다면, ViewModel의 객체 또한 같은 방식으로 보낼 수 있을 것이다.

 

#1-2 ViewModel이 쓰인 샘플 앱

 

[Android] LiveData - 기초

#1 개요 #1-1 LiveData LiveData 개요 | Android 개발자 | Android Developers LiveData를 사용하여 수명 주기를 인식하는 방식으로 데이터를 처리합니다. developer.android.com LiveData. 문서적인 정의는 Data의 변경을 관

kenel.tistory.com

위 게시글의 완성된 앱을 토대로 코드를 수정한다.

 

#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 완성된 앱

https://github.com/Kanmanemone/android-practice/tree/master/view-model/ViewModelToView