티스토리 뷰

반응형

databinding을 사용하기 전에 먼저 build.gradle에 아래를 추가해줍니다.

 

android {

	...
    
    dataBinding {
            enabled = true
        }
}

 

 

 

간단한 databinding 설명

 

//User.kt

data class User(val name: String? = null, val age: String? = null, val number: String? = null)

값을 저장하는 data class인 User 클래스를 만들었습니다.

 

// MainActivity.kt

class MainActivity : AppCompatActivity() {

    lateinit var binding: ActivityMainBinding

    val user = User("ImLeaf", "18", null)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.main = this

    }
}

MainActivity 입니다.

 

ActivityMainBinding을 상속받고 있는 binding이라는 변수에

DataBindingUtil.setContentView를 넣고 binding.main에 context를 넣었습니다.

 

ActivityMainBinding 같은 경우는 DataBinding이 알아서 MainActivity면 Main, LoginActivity면 Login으로 만들어 줍니다.

binding.main = this 같은 코드는 아래 xml을 보면 이해할 수 있습니다.

 

// activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout>
    <data>
        <variable
            name="main"
            type="com.leaf.android_databinding_example.MainActivity" />

        <import type="android.view.View"/>
    </data>

    <LinearLayout 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"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical"
        tools:context=".MainActivity">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{main.user.name}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{main.user.age}" />

    </LinearLayout>
</layout>

먼저 xml 코드입니다.

 

<layout>
    ...
</layout>

레이아웃으로 감싸면서 databinding을 할 수 있습니다.

 

<data>
        <variable
            name="main"
            type="com.leaf.android_databinding_example.MainActivity" />
            
    </data>

이름을 원하는 것으로 지정을 하고 type으로 databinding을 하고 싶은 class에 연결해주면 됩니다.

 

위에서 말했던 binding.main = this 코드에서 main이 바로 xml에서 지정한 name입니다.

 

 

위와 같이 간단하게 databinding을 할 수 있습니다.

 

 

 

 

databinding을 통해 view의 visibility 설정

 

 

null 값이 들어왔을때 view의 visibility를 gone으로 바꾸는 방법도 있습니다.

 

먼저 xml의 data 부분에 아래와 같이 import 코드를 추가해줍니다.

 

<data>
        <variable
            name="main"
            type="com.leaf.android_databinding_example.MainActivity" />

        <import type="android.view.View"/>
    </data>

 

그리고 아래와 같이 앨비스 연산자를 사용하여 설정 할 수 있습니다.

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:visibility="@{main.user.number == null ? View.GONE : View.VISIBLE }"
    android:text="@{main.user.number}" />

 

 

databinding을 통해 클릭 이벤트 하기

 

// MainActivity.kt

fun hello() = Toast.makeText(this, "Hello!", Toast.LENGTH_SHORT).show()

MainActivity에 위와 같은 함수를 추가했습니다.

 

<Button
    android:layout_width="100dp"
    android:layout_height="wrap_content"
    android:onClick="@{() -> main.hello()}"
    />

xml 코드에서 위와 같이 onClick을 선언해주고 "() -> main.hello()" 으로 사용할 수 있습니다.

 

 

 

 

 

예제 코드

https://github.com/Im-Tae/Blog_Example/tree/master/Android/Android_DataBinding_Example

반응형
댓글