본문 바로가기
안드로이드

[안드로이드] Databinding 알아보기

by krapoi 2022. 3. 9.
반응형

저번 MVVM을 알아보고 연습하기 위해 인터넷을 찾아봤는데 Databinding 이란 것도 알아냈다.

생각보다 유용한 거 같아 가져와 봤다.

 

일단 데이터 바인딩을 쓰는 이유부터 알아보자.

 

데이터 바인딩을 쓰면 xml파일에 데이터를 넣기 때문에

상대적으로 코드 수 가 적어지게 된다.

또한 findViewId()를 쓰지 않아도 된다.

그리고 이전에 설명한 MVVM패턴 구현에도 유용하기 때문이다.

 

아, 참고로 구글에서는 findViewId만 쓰지 않을 거라면 차라리 쓰지 말라고 한다.

어쨌든 이러한 이유들로 쓰게 되는 데이터 바인딩에 대해 알아보자.

 

먼저 gradle을 추가해 줘야 한다.

 

build.gradle이 2개가 있을 건데 빨간 동그라미가 쳐져있는 build를 켜면 된다.

 

그다음 android 부분에 이 코드를 추가해 준다.

 android {
 
 	...
    
 dataBinding {
        enabled = true
    }
}

그리고 xml을 만들러 가보자.

처음 만들게 되면 이렇게 되어 있을 건데

 

이런 식으로 layout으로 감싸주도록 하자.

layout으로 감싸지 않으면 데이터 바인딩을 쓰지 못하니 주의하자.

 

그다음 data를 추가해주자.

 

 

이런 식으로.

그다음은 Activity로 넘어가자.

 

 

먼저 binding을 시켜주자.

이런 식으로 먼저 바인딩을 해주면 된다.

아 참고로 mbinding의 ActivityScondBinding은 layout에 이름에 따라 달라지니 주의

(ex : layout = Main,

private lateinit var mbinding = ActivityMainBinding)

 

그다음 setContentView를 지운 뒤 DataBindUtill로 교체한다.

이러면 binding을 통하여 레이아웃 관리가 가능해진다.

 

그다음 data 클래스를 하나 만들어주자.

나는 이렇게 만들어 주었다.

그리고 다시 xml파일에 가서 data부분을 수정해 준다.

variable에 사용할 이름을 name에 넣으면 된다. (data파일 이름과 같을 필요는 없음)

type은 아까 만들어준 data파일을 넣어주자.

 

이제 다시 Activity로 넘어가서

 

 

이런 식으로 person을 지정해 주자.

mbinding의 person 같은 경우는 위 xml파일의 name과 같다.

 

그다음 xml textView에 text에 값을 넣어주면 끝.

참고로 text값에 String이 아닌 값이 들어가면 FATAL EXCEPTION이 뜨니 조심하자.

 

어쨌든 이렇게 작성하면

잘 나오는 것을 확인할 수 있다.

이게 데이터 바인딩이 여러 가지 있던데

다음번에는 실시간 데이터를 가져와 보겠다.

 

코드

activity_second

<?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="person"
            type="com.example.sharpcode.view.Person" />

    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{person.name.toString()}"
            android:textSize="100dp"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{Integer.toString(person.age)}"
            android:textSize="100dp"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{Integer.toString(person.height)}"
            android:textSize="100dp"
            />
    </LinearLayout>


</layout>

Person.kt

data class Person(
    val name : String,
    val age : Int,
    val height : Int
)

MainActivity.kt

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import com.example.sharpcode.R
import com.example.sharpcode.databinding.ActivitySecondBinding

class MainActivity : AppCompatActivity() {

    private lateinit var mbinding : ActivitySecondBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mbinding = DataBindingUtil.setContentView(this,R.layout.activity_second)

        var person = Person(name = "krapoi",18,174)
        mbinding.person = person
    }
}

 

 

반응형