본문 바로가기

Android/Jetpack, Clean Architecture

DataBinding에 ViewModel, LiveData와 함께 사용하기

지난 LiveData 사용하기에 이어서 DataBinding을 ViewModel, LiveData와 함께 사용해보려고 합니다.

 

결과물 

버튼을 클릭하면 1을 더한 결과를 보여줍니다.


주요 처리 사항

ViewModel을 Databinding에 사용하기

덧셈 결과(LiveData)가 버튼 클릭으로 인해 변경될 때마다 실시간으로 TextView에 반영이 됩니다.  

MainActivity.kt에서 덧셈 결과(LiveData)를 관찰하는 코드를 명시 안 해도 됩니다.

 

  • MainActivity.kt

ViewModel을 생성한 이후 binding의 변수로 사용합니다.

layout에서 ViewModel이 가지고 있는 LiveData, 함수 등을 사용할 수 있습니다.

또한 LiveData를 DataBinding에서 사용할 때 LiveData의 Lifecycleowner가 현재 activity(Main)라는 것을 명시해줘야 합니다.

LiveData는 앱 구성요소의 생명주기를 인지하는 특성 때문입니다.

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private lateinit var viewModel: MainActivityViewModel
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        viewModel = ViewModelProvider(this).get(MainActivityViewModel::class.java)
        // liveData를 binding에서 사용하기 위해
        // 뷰 모델 객체에 실제 lifecycleowner를 현재 activity로 지정해줘야 함
        binding.lifecycleOwner = this
        // 뷰 모델을 바인딩 변수로 사용함
        binding.myViewModel = viewModel

    }
}

 

  • MainActivityViewModel.kt

여기서 사용하는 ViewModel은 다음과 같습니다.

class MainActivityViewModel : ViewModel() {
    private  var count = MutableLiveData<Int>()
    val countData : LiveData<Int>
    get() = count

    init {
        count.value = 0
    }

    fun updateCount(){
        count.value = (count.value)?.plus(1)
    }
}

 

  • activity_main.xml

ViewModel을 변수로 가지고 LiveData 값이 변경될 때마다 TextView의 텍스트에 반영되도록 했습니다.

<data>
   <variable
     name="myViewModel"
     type="com.keepseung.livedatadatabinding.MainActivityViewModel" />
</data>
  
    '''
<TextView
	'''
	android:text="@{String.valueOf(myViewModel.countData)}"

 

Listener Binding 적용

버튼을 클릭했을 때 ViewModel의 덧셈 함수를 실행할 수 있습니다. 

 

  • activity_main.xml

Listener Binding은 이벤트가 발생할 때 실행되는 Binding 표현식입니다.

버튼을 클릭할 때마다 viewmodel의 덧셈 함수가 실행됩니다.

<Button
    '''
    android:onClick="@{()->myViewModel.updateCount()}"

 

 

 

지금까지 DataBinding에 ViewModel, LiveData와 함께 사용하는 방법에 대해서 알아봤습니다.

LiveData, Databing, ViewModel 각각 같이 사용하기에 편리하다는 것을 알 수 있습니다.

 

참고 : developer.android.com/topic/libraries/data-binding/expressions?hl=en#listener_bindings

 

레이아웃 및 결합 표현식  |  Android 개발자  |  Android Developers

표현식 언어를 사용하면 뷰에 의해 전달된 이벤트를 처리하는 표현식을 작성할 수 있습니다. 데이터 결합 라이브러리는 레이아웃의 뷰를 데이터 객체와 결합하는 데 필요한 클래스를 자동으로

developer.android.com

전체 소스코드 : github.com/keepseung/Android-Blog-Source

 

keepseung/Android-Blog-Source

https://develop-writing.tistory.com/ 에서 제공하는 예제. Contribute to keepseung/Android-Blog-Source development by creating an account on GitHub.

github.com