DataBinding 이란?
DataBinding이란 안드로이드 JetPack 라이브러리 중 하나로 Activity, Fragment의 데이터를
화면에 출력하기 위해 도와주는 AAC(Android Archiecture Component)의 기법입니다.
주로 MVVM 디자인패턴에서 사용합니다.
DataBinding 장점
- Activity에서 View에 접근하는 보일러 플레이트 코드를 작성하지 않아도 된다.
- 파일이 더욱 단순화 되어 유지관리가 쉬워진다.
- 메모리 누수방지, null 위험을 방지할 수 있다.
DataBinding 단점
- Class파일이 많이 생겨 빌드속도가 느려지고 앱 용량이 증가한다.
- xml에서 사용할 경우 디버깅이 힘들다.
그래서 FindViewById 만을 대체하기 위해 사용할 경우에는
DataBinding 보다 더 작은 개념인 ViewBinding을 사용하는 것이 좋다.
DataBinding vs ViewBinding
- Binding은 2가지 종류가 있다.
- DataBinding이 더 큰 개념이다.
- 그래서 DataBinding을 이용하면 ViewBinding 처럼 이용 가능하다.
DataBinding 간단 사용법
DataBinding을 사용하기 위해서는 라이브러리 선언을 해야합니다. ( build.gradle - Module)
android {
...
buildFeatures {
dataBinding true
}
}
그리고 새 프로젝트를 생성해주세요!
1. activity_main.xml
일단 간단하게 화면 구성부터 먼저 하겠습니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="이름이 들어올거에요!"
android:textSize="40sp"
android:layout_gravity="center"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="나이가 들어올거에요!"
android:textSize="40sp"
android:layout_gravity="center"
android:layout_marginTop="30dp"/>
</LinearLayout>
TextView 2개가 있는 간단한 화면입니다.
여기서 DataBinding을 사용할 겁니다. xml 에서 레이아웃을 사용하기 위해서는
우리가 만든 코드 전체를 <layout> </layout> 으로 감싸야 합니다.
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="이름이 들어올거에요!"
android:textSize="40sp"
android:layout_gravity="center" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="나이가 들어올거에요!"
android:textSize="40sp"
android:layout_gravity="center"
android:layout_marginTop="30dp" />
</LinearLayout>
</layout>
그리고 이 layout에 해당 부분을 추가해야 하는데 <data> </data> 안에 Layout에서 사용할 변수를 만드는것 입니다.
<variable name = "변수명" type = "어느패키지에 어느클래스를 사용할것 인가.">
필자는 com.jutole.databinding 패키지에 User라는 dataClass를 생성했다.
마지막으로 이부분을 수정하면 된다. 우리가 위에서 만든 xml 변수를 사용하려면 @{ } 안에서 사용해야한다!
왜 @{profile.name} 인가.. 이해가 안 됐을 분들을 위해서 추가 설명..
우리는 위에서 xml 변수를 만들고 변수명을 profile로 만들었다.
그리고 사용할 클래스는 User 클래스로 만들었다.
User 클래스가 가지고 있는 정보? 내용? 은 name과 age 이다.
그럼 profile.name 은 이해가 될것이다.
@{String.valueOf(profile.age)} 이 부분은 특별할것은 없다. 그냥 Int형태로 받아온 age(나이)를
text에 띄우기 위해 String으로 바꾸는 작업이다.
2. MainActivity
MainActivity는 간단하다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.profile = User("주톨", 24)
}
}
이게 끝이다.. 생성 시 코드랑 달라 진점은 하나 뿐이다.
setContentView(R.layout.activity_main)
↓
val binding : ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
*코드설명
기존에는 Activity에 화면을 보여주기 위해서는 XML에 정의된 각 위젯들이 정의된 속성을 지정하고 상하관계에 맞춘 뒤
메모리에 올려야하는데 이러한 작업을 Activity에 setContentView() 함수에서 했습니다.
하지만 우리는 DataBinding을 사용할것이기 때문에 DataBindingUtil 에 있는 setContentView를 사용할겁니다.
val binding : ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main) →
val 변수명 : ActivityMainBinding = DataBindingUtil.setContentView(어느액티비티에띄울것이냐, 어떤레이아웃을)
binding(변수명)에는 해당 layout에 대한 정보를 담고 있다. ex) layout에서만든변수, 만든 View의 ID 등등...
binding.profile = User("주톨", 24) →
biding에는 layout에만든 변수에 대한 정보가 있으므로 layout에서 만든 변수 profile에 값을 넣어주겠다 이 말입니다.
어떤값을? User클래스에서 생성한 객체를 넘겨주겠다. (User클래스는 우리가 따로만든 dataClass이다. 위에보면 있다)
이 걸로 코드구현은 끝났다. 실행해보자 !
봐주셔서 감사합니다. 이해안가는 부분이나 틀린 부분이 있다면 댓글로 알려주세요
.
'Android-Kotlin > JetPack' 카테고리의 다른 글
[Android] LiveData 란? (0) | 2022.06.25 |
---|---|
[Android] ViewModel을 Fragment에서 간단 사용 - Kotlin (0) | 2022.06.24 |
[Android] ViewModel 개념 (0) | 2022.06.24 |
[Android] DataBinding을 Fragment에서 사용하기 - Kotlin (0) | 2022.06.21 |