DataBinding

2021. 8. 13. 16:15Android/AAC

  • DataBinding이란? UI와 데이터소스를 연결하는 방식
  • DataBinding 특징
    • 단방향 데이터 바인딩 - 표현식 : "@{[args]}"
    • 양방향(two-way) 데이터 바인딩 지원 - 표현식 : "@={[args]}"
  • DataBinding 사용법
    1. build 설정
    2. layout 추가 설정
    3. 데이터바인딩 추가
    4. layout에서 표현식으로 값 사용

1. build 설정

android {
    ...
    buildFeatures {
        dataBinding true
    }
}

2. layout 추가 설정(layout태그로 감싸고, 필요한 경우 data 설정해 변수 추가)

<?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.example.studykotlin.MainViewModel" />
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

       ...

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

3. 데이터바인딩 추가

// 필수 설정(lifecycleOwner는 LiveData 사용위해 설정 필요)
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main);
binding.lifecycleOwner = this; 

val viewModel = ViewModelProvider(this, 
	ViewModelProvider.AndroidViewModelFactory(application))[MainViewModel::class.java]
    
// 레이아웃 파일에서 정의한 데이터에 값 바인딩
binding.viewModel = viewModel
class MainViewModel(application: Application) : AndroidViewModel(application) {

    private val str : LiveData<String?> = MutableLiveData<String?>(null)
    private val db = Room.databaseBuilder(application, Database::class.java, "room")
        .allowMainThreadQueries()
        .build();

    var entities : LiveData<List<Entity>>
	var input : String? = null
    
    init{
        entities = getAll()
    }


    fun getAll() : LiveData<List<Entity>> {
        return db.Dao().getAll()
    }

    suspend fun insert(entity: Entity) {
        db.Dao().insertEntity(entity)
    }
    
    fun inputData(title : String){
    	// lifecycle-viewmodel 패키지 필요
    	viewModelScope.launch(Dispatchers.IO){
        	insert(Entity(title))
        }
    }
}

4. layout에서 표현식으로 값 사용

<?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.example.studykotlin.MainViewModel" />
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <EditText
            android:id="@+id/input"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:hint="데이터를 입력하세요"
            android:text="@={viewModel.input}"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="@+id/button"
            app:layout_constraintTop_toTopOf="parent" />

        <Button
            android:id="@+id/button"
            android:layout_width="88dp"
            android:layout_height="wrap_content"
            android:text="추가"
            android:onClick="@{() -> viewModel.inputData(viewModel.input)}"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintLeft_toLeftOf="@+id/input"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/result"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:text="@{viewModel.entities.toString()}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/input" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 

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

 

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

데이터 결합 라이브러리 Android Jetpack의 구성요소. 데이터 결합 라이브러리는 프로그래매틱 방식이 아니라 선언적 형식으로 레이아웃의 UI 구성요소를 앱의 데이터 소스와 결합할 수 있는 지원

developer.android.com

 

'Android > AAC' 카테고리의 다른 글

Jetpack - Compose  (0) 2021.10.28
Navigation  (1) 2021.08.13
ViewModel  (1) 2021.08.12
LiveData  (0) 2021.08.12
Room  (0) 2021.08.12