안드로이드 공식문서
https://developer.android.com/topic/libraries/data-binding?hl=ko
Databindnig은 동적인 UI 변화를 XML에서 처리하는 Jetpack 라이브러리다.
예를 들어, 어떠한 이벤트가 발생했을 때 A라는 Text가 B로 변한다고 할 때
우리는 Activity 또는 Fragment에서 다음과 같이 처리한다.
button.setOnClickListener {
test.text = "B"
}
하지만 Databinding을 사용하면 XML에서 설정 가능하므로 코드가 한결 가벼워진다.
<TextView
android:text="@{viewmodel.userName}" />
일반적으로 Databinding은 LiveData를 observe하여 데이터 변화를 관찰하며 결합하므로 ViewModel과 함께 쓰인다.
사용 방법
1. build.gradle (Module)
android {
...
buildFeatures {
dataBinding true
}
}
2. XML
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="viewModel"
type="com.myapp.data.ViewModel" />
<import type="android.view.View"/>
</data>
<LinearLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".main.MainActivity">
<TextView
android:text="@{viewModel.userName}"
android:visibility="@{viewModel.boolean ? View.VISIBLE : View.INVISIBLE}"
android:onClick="@{()->viewModel.함수명()}"/>
</LinearLayout>
</layout>
Databinding을 사용할 때 XML에서의 기본적인 형태는 다음과 같다.
<layout>으로 감싸고 Databinding으로 사용할 변수 및 객체 등을 <data>에서 선언하며
이외에는 기본적인 XML과 동일하다.
3. MainActivity
class MainActivity : AppCompatActivity() {
lateinit var binding : ActivityMainBinding
val viewModel : TestViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.viewModel = viewModel
binding.lifecycleOwner = this
}
}
XML에서 <data>에 선언한 변수는 다음과 같이 초기화해주어야 하며,
lifecycleOwner를 지정해주어 같은 생명 주기임을 알려주어야 한다. ( 지정해주지 않을 경우 데이터가 변하지 않는다. )
BindingAdapter
BindingAdapter는 XML에서 값을 받아 UI를 설정한다.
예제
BindingAdapter
@BindingAdapter("age")
fun select(view: View, b: Boolean) {
if(b) view.setBackgroundColor(Color.RED)
else view.setBackgroundColor(Color.Blue)
}
Data Class
data class User(
val name : String,
val age : Int
)
XML
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="user"
type="com.myapp.data.User" />
</data>
<LinearLayout>
<TextView
android:text="@{user.name}"
age="@{user.age > 19}"/>
</LinearLayout>
</layout>
user의 나이가 20살 이상이라면 배경색이 빨강 아니면 파랑으로 설정한다.
자세한 내용은 공식문서를 참고바랍니다.
'안드로이드 > Jetpack' 카테고리의 다른 글
[안드로이드] Navigation Component (0) | 2023.11.29 |
---|---|
[안드로이드] Jetpack (0) | 2023.11.24 |
[안드로이드] ViewModel (1) | 2023.11.24 |
[안드로이드] LiveData (1) | 2023.11.23 |
[안드로이드] Room DB (0) | 2023.11.23 |