지난 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
전체 소스코드 : github.com/keepseung/Android-Blog-Source
'Android > Jetpack, Clean Architecture' 카테고리의 다른 글
[Android] AAC Navigation 살펴보기 (0) | 2021.02.16 |
---|---|
Android 양방향 데이터 바인딩 사용하기 (Two-way DataBinding With LiveData) (0) | 2021.02.16 |
[안드로이드/Android] LiveData 사용하기 (0) | 2021.01.25 |
[안드로이드/Android] ViewModel 사용하기 (0) | 2021.01.20 |
[안드로이드/Android] Databinding 사용하기 (0) | 2021.01.20 |