CS/Android, Kotlin
[Android] Data Binding
dongdong216
2023. 4. 15. 22:33
면접기록용 Data Binding 정리
Data Binding은 xml 파일에 data를 연결해서 사용할 수 있도록 도와주는 것으로 MVVM 패턴을 구현할 때 LiveData와 함께 거의 필수적으로 사용됨. 데이터 바인딩의 장점은 글루 코드를 줄일 수 있음. 레이아웃과 데이터를 연결하기 위한 코드들을 줄일 수 있음.
내가 사용했던 부분
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="viewModel"
type="com.shootit.greme.viewmodel.MainViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.view.MainActivity">
// ...
<TextView
android:id="@+id/tvPageName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/BoldText"
android:text="@{viewModel.currentPage.text}"
// ...
/>
// ...
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
전체를 <layout> 태그로 감싸주고 <data> </data> 태그 사이에 <variable> 태그로 데이터 바인딩에 필요한 변수를 선언해줌. 나는 viewmodel을 데이터 바인딩에 필요한 변수로 사용할 예정이어서 다음과 같이 해줌.
class MainActivity : BaseActivity<ActivityMainBinding>(R.layout.activity_main) {
override val viewModel by viewModels<MainViewModel> {
MainViewModel.MainViewModelFactory(/* 필요한 정보 */)
}
override fun initViewModel(viewModel: ViewModel) {
binding.lifecycleOwner = this@MainActivity
binding.viewModel = this.viewModel
}
// ...
}
그리고 main activity 클래스에서 뷰모델 만들어주고 이를 xml 상에서 선언했던 variable인 viewmodel에 넣어줌.
class MainViewModel(private val tmp: String): ViewModel() {
// ...
var currentPage = MutableLiveData<MainFragmentEnum>(MainFragmentEnum.HomeFragment)
}
ViewModel 클래스에서는 다음과 같이 사용함. currentPage 변수의 값이 바뀔 때마다 XML 상에서도 반영이 됨.
XML에서 용법
값 자체를 사용할 때
android:text="@{변수명}"
기본 값 설정
android:text="@{변수명, default=기본값}"
함수 설정
android:onClick="@{() -> vm.함수명()}"
조건문 사용
// 삼항 연산자 사용
android:text="@{String.valueOf(변수 == null ? 0 : 1)}"
Binding Adapter
안 썼음.
https://todaycode.tistory.com/53
Reference
https://velog.io/@jojo_devstory/Android-Databinding을-알아보자
https://velog.io/@changhee09/안드로이드-Data-Binding
https://show-me-the-money.tistory.com/entry/Android-Data-Binding-기본-활용법-총정리