Data Binding 의 작동 방식
레이아웃의 각 보기에 대한 참조를 포함하는 바인딩 개체를 만듭니다.
바인딩 개체가 생성되면 바인딩 개체를 통해 앱의 모든 구성 요소가 보기 및 기타 데이터에 액세스할 수 있습니다.
Android 시스템은 항상 보기를 검색하면서 보기 계층을 반복할 필요가 없습니다.
Data Binding 장점
데이터 바인딩은 앱의 성능을 크게 향상시킵니다
데이터 바인딩을 통해 FindViewById를 제거할 수 있으며, 데이터 바인딩을 통해 코드를 간결하고 읽기 및 유지 관리할 수 있습니다
데이터 바인딩 개체 생성은 컴파일 시간에 수행되기 때문에 오류가 있으면 컴파일 시간 동안 인식할 수 있습니다. 따라서 사용자가 앱과 상호 작용할 때 런타임에 보기 관련 오류가 발생하지 않습니다.
Data Binding 사용법
<간단한 요약>
- gradle 파일에서 데이터 바인딩을 활성화
- xml 레이아웃 파일을 레이아웃 태그로 감싸기
- Activity에서 데이터 바인딩 개체를 구성
- 데이터 바인딩 개체를 사용하여 findViewById를 사용하지 않고 뷰를 호출가능
첫번째로 gradle에
dataBinding{
enabled = true
}
을 추가합니다
만약 gradle version이 4.0 이상이면 이 코드를 추가합니다
buildFeatures{
dataBinding= true
}
그 다음 사용할 xml에 가서 최상위 xml을 로 바꿉니다.
이때 네임스페이스 선언은 맨 바깥쪽 태그에 있어야 하므로 바깥에 선언해줍니다
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"
(이 부분)
아래는 xml전체 코드 입니다
<?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">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/name_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/greeting_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="146dp"
app:layout_constraintEnd_toEndOf="@+id/name_edit_text"
app:layout_constraintStart_toStartOf="@+id/name_edit_text"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/name_edit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="286dp"
android:ems="10"
android:hint="이름을 적으세요"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/submit_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="114dp"
android:text="Button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/name_edit_text" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
Android 데이터 바인딩 라이브러리는 ActivityMainBinding이라는 이름의 바인딩 개체를 만듭니다.
데이터 바인딩 라이브러리가 데이터 바인딩 개체에 대한 이름 바인딩을 만드는 방법
데이터 바인딩 라이브러리는 xml 레이아웃 이름을 사용하고 각 이름의 첫 글자를 대문자로 만들고 밑줄을 제거하고 끝에 바인딩을 추가합니다.
예 ) activity_main ==> ActivityMainBinding
setContentView(R.layout.activity_main)
이 코드는 화면에 layout을 나타내 줍니다.
하지만 데이터 바인딩에서는 구속력 있는 객체를 사용하여 동일한 작업을 보다 효율적이고 효과적으로 수행할 수 있습니다.
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
데이터 바인딩 개체 생성 코드로 바꿔 줍니다
이렇게 생성된 바인딩 개체를 사용해 xml의 view에 접근할수 있습니다
이때 속성 이름은 밑줄을 제거되며 카멜 케이스로 생성됩니다.
카멜 케이스란? 첫번째 단어는 소문자 두번째단어부터는 대문자
예 ) greeting_text_view ==> greetingTextView
binding.greetingTextView.text = "Hello! "+binding.nameEditText.text
위의 코드가 있습니다. 바인딩을 여러번 쓰기 귀찮을 경우 이런식으로 사용할수 있습니다
binding.apply {
greetingTextView.text = "Hello! "+nameEditText.text
}
보다 깔끔하고 귀찮은 일이 덜어집니다!
아래는 전체 MainActivity.kt의 전체 코드 입니다
package com.example.databinding
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import com.example.databinding.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding : ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.submitButton.setOnClickListener {
displayGreeting()
}
}
private fun displayGreeting(){
binding.apply {
greetingTextView.text = "Hello! "+nameEditText.text
}
}
}
이것으로 Databinding의 간단한 사용방법을 알아 봤습니다
'Android' 카테고리의 다른 글
RecyclerView 란? (0) | 2021.04.03 |
---|---|
Databinding과 Viewbinding의 차이점 (0) | 2021.04.01 |
Firebase addValueEventListener() 사용후 문제점 (0) | 2021.03.26 |
Main(UI) Thread 란?, Worker Thread 란? (0) | 2021.03.26 |
View Model을 왜 쓸까? (0) | 2021.03.25 |