제이슨의 개발이야기
안드로이드 데이터 바인딩 Data Binding 본문
안녕하세요!
오늘은 안드로이드 데이터 바인딩에 대해서 이야기 해보려고 합니다!
데이터 바인딩이란
프로그래매틱 방식이 아니라 선언적 형식으로 레이아웃의 UI 구성요소를 앱의 데이터 소스와 결합할 수 있는 지원 라이브러리입니다
앱의 데이터 소스와 결합할 수 있어서 UI 요소에 연결하기 위해 필요한 코드를 최소화 할 수 있습니다 !
장점을 이야기 해보자면
1.findViewId()를 호출하지 않아도 자동으로 xml 에 있는 View들을 만들어 줍니다
2.data가 바뀌면 자동으로 View를 변경할 수 있습니다
3.코드의 가독성이 좋아집니다
등등 많은 장점이 존재합니다!
장점이 있으면 동시에 단점도 존재합니다!
클래스 파일이 많이 생겨 빌드 속도가 느려지는 단점이 존재하는대
MVVM 또는 MVP 아키택처를 함께 사용해야 빛을 발한다고 합니다!
기존에 findViewById() 를 통해서 레이아웃에 뷰 컴포넌트를 찾아서 거기에 변화를 주었는대
이런 경우 findViewById() 구문이 호출 될때 마다 레이아웃 파일 트리를 순회하며 요소를 찾아야 해서
레이아웃 파일이 많아 지거나 찾는 요소가 많아 질 수록 시간이 늘어나게 됩니다
그러나 DataBinding 을 이용한다면
레이아웃 파일을 중개해주는 오브젝트를 만들어 관리함으로 써 더 효율적으로 레이아웃 요소에 접근 할 수 있습니다!!
간단하게 데이터 바인딩 세팅 하는 방법은
먼저 app module 의 gradle 파일을
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-android-extensions'
}
android {
compileSdkVersion 31
androidExtensions { experimental = true }
defaultConfig {
applicationId "@@@@@@@@@@2"
minSdkVersion 26
targetSdkVersion 31
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildFeatures{
dataBinding = true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
으로 세팅 하고
테스트를 위해서
activity_main.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">
<data>
<variable
name="model"
type="com.example.musicplayer.User" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{model.name}"
android:id="@+id/txt"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
으로 세팅을 해줍니다!
layout 태그 안에 뷰 컴포넌트를 정의 하고
data 태그 안에 바인딩 할 데이터의 이름(model)과 타입(type)을 작성 해줍니다!
TextView 컴포넌트에
text = "@{model.name}" 이 있는대
"@{}" 는 데이터 바인딩 을 통해서 직접 접근하는 연산자 입니다
즉 model.name은
데이터 바인딩 되어 있는 User 객체의 name 필드를 가지고 온다는 의미입니다!
그리고 Data Class 파일 User을 하나 만들어 주고
data class User(
var name :String,
var age : Int
)
MainActivity 클래스 파일을 이와 같이 작성해서 실행 하면 간단하게 데이터 바인딩을 확인 할 수 있습니다!
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import com.example.musicplayer.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.model = User("Jason",25)
}
}
gradle 파일에 databinding = true 로 하고
activity_main.xml 파일에 layout 태그를 사용 하게 되면
레이아웃 파일을 중개해주는 오브젝트를 생성 할 수 있습니다!
ActivityMainBinding이 레이아웃 파일 중개해주는 오브젝트 입니다!
지금 간단하게 Data 클래스 User 를 만들어서 User 데이터 객체와 데이터 바인딩을 시켜줬지만
MVVM을 공부 하게 된 경우
Data 객체가 아닌 ViewModel 과 연결 해서 사용 할 경우 훨씬 효율적인 구조를 만들 수 있습니다!
'안드로이드' 카테고리의 다른 글
안드로이드 Context 란? (0) | 2022.11.19 |
---|---|
(포트포워딩 하는법)외부 Client 와 VirtualBox Ubuntu 환경에서 작동하는 Server 연결 (2) | 2022.03.30 |
build.Gradle 파일? build.Gradle(project) 와 build.Gradle(app) 차이 (0) | 2021.09.06 |
안드로이드 현재 배터리 잔량 체크 하는 메소드 (0) | 2021.08.18 |
안드로이드 앱 포그라운드, 백그라운드 체크 하는 방법 ! 포그라운드,백그라운드 일때 푸시 메시지 다르게 구현 (0) | 2021.08.13 |