본문 바로가기

안드로이드/Jetpack

[안드로이드] Databinding

안드로이드 공식문서

https://developer.android.com/topic/libraries/data-binding?hl=ko

 

데이터 결합 라이브러리  |  Android 개발자  |  Android Developers

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 데이터 결합 라이브러리 Android Jetpack의 구성요소. 데이터 결합 라이브러리는 프로그래매틱 방식이 아니라 선

developer.android.com

 

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