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-기본-활용법-총정리