하루에 0.01%라도 성장하자

Develop/Android

Android - Data Binding

뚠님 2021. 4. 8. 14:28
반응형

Kotlin 을 이용한 Data Binding을 위한 셋팅

 

데이터 바인딩은 넓은 호환성을 위해 Android 2.1 이상(API level 7)에서 사용할 수 있도록 되어 있음. ( 엄청난 호환성.. )

 

1. 세팅

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'
}

....
dataBinding{
    enabled = true
}

Module level의 Gradle에 위와 같은 설정을 해준다.

 

MainActivity에 버튼을 하나 만들어서 로그를 출력하는 형태로 개발

 

activity_main.xml 의 경우 기본 설정되는 layout을 감싸는 형태로 layout을 써줘야 한다.

말이 이상한데 아래 코드를 보고 확인

 

<?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="activity"
            type="com.cleancode.android_espresso_test.MainActivity" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <Button
            android:id="@+id/btn_start_webview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="@{activity::btnClick}"
            android:text="Start WebView"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

위 코드를 보면 ConstraintLayout 위에 layout 이라는 상위 값이 생겼다.

이렇게 한번 더 감싸줘서 사용해야 DataBinding이 된다.

주의깊게 봐야 할 것은 Button view에 onClick 이다.

 

android:onClick="@{activity::btnClick}"을 통해서 마치 이전에 view를 생성후 onClickListener를 달아서 처리해 준것과 같은 효과를 가진다.

 

package com.cleancode.android_espresso_test

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.databinding.DataBindingUtil
import com.cleancode.android_espresso_test.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.activity = this@MainActivity
    }

    fun btnClick(view: View) {
        Log.i("MainActivity", "btnClick")
    }
}

MainAcitivty 코드인데 우선 acitivity_main.xml에 생성된 button view를 클릭하면 btnClick이 실행되도록 하였다.

 

위 코드를 보면 

private lateinit var binding: ActivityMainBinding

이 코드가 있는데, AcitivtyMainBinding의 경우 위 activity_main.xml 파일에 layout으로 감싸 주면 자동으로 생성되는 클래스이다.

( 추가적으로 ActivityMainBindingImpl 도 생성되는데 이 부분에서 error cannot find symbol databinding impl 가 발생하는 경우가 있다. 이부분은 향후에 에러가 발생하면 원인을 추가적으로 찾아보면 된다. )

 

참고 사이트 : hoonyspark.tistory.com/6

 

위 코드를 작성하면 버튼을 눌렀을 때 "btnClick" 로그가 출력된다.

Activity 화면
로그 출력

 

반응형