안드로이드

안드로이드 코틀린으로 데이터바인딩 하는 방법! Android DataBinding with Kotlin

알통몬_ 2018. 3. 29. 16:14
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


이번 포스팅에서는 안드로이드 스튜디오에서 자바가 아닌

코틀린으로 데이터 바인딩하는 방법에 대해 공부합니다.


1. 프로젝트 생성하기

이건 뭐 다들 아시죠? 프로젝트 생성 시 

import kotlin 어쩌구 체크 안 하셔도 됩니다.


2. build.gradle(Project)와 build.gradle(app) 에 코드 추가하기

- build.gradle(Project)

buildscript {
ext.kotlin_version = '1.2.21'
ext.android_plugin_version = '3.1.0'
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:$android_plugin_version"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
google()
jcenter()
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

위와 똑같이 해주시면 됩니다.


- build.gradle(app)

apply plugin: 'com.android.application'
apply plugin: 'kotlin-kapt'
apply plugin:
'kotlin-android'

android {
compileSdkVersion 26
defaultConfig {
applicationId "dev.cr.com.kotlindatabinding"
minSdkVersion 17
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dataBinding {
enabled true
}

}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
kapt "com.android.databinding:compiler:$android_plugin_version"
}

app 파일에도 여러 줄의 코드가 추가되는데요.

위에서 under-line에 bold 처리 된 코드들이 추가된 코드들이에요.

kapt "com.android.databinding:compiler:$android_plugin_version"

위 라이브러리의 버전은 꼭 gradle의 버전과 맞춰주어야 합니다.


혹여나 app 파일에 아래 코드가 있다면 지워주시면 됩니다.

apply plugin: 'kotlin-android-extensions'


3. databinding 할 클래스를 만들어 줍니다.

저는 정말 간단하게 만들었습니다.

package dev.cr.com.kotlindatabinding

data class Constss(val hello : String)


---------------------------------------------------------------------------------------------------------


---------------------------------------------------------------------------------------------------------




4. layout.xml 파일에 태그 추가 및 data, variable 추가하기

<?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="constss"
type="dev.cr.com.kotlindatabinding.Constss"/>

</data>

<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="dev.cr.com.kotlindatabinding.MainActivity">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{constss.hello}"
android:textColor="#000000"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>
</layout>


5. Activity 에 코드 추가하기

package dev.cr.com.kotlindatabinding

import android.databinding.DataBindingUtil
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import dev.cr.com.kotlindatabinding.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)

val constss = Constss("HELLO WORLD!")

binding.setVariable(BR.constss, constss)

}
}

Activity 에 들어가는 코드는 자바와 크게 다르지 않습니다.

그런데 여기까지만 하고 빌드를 하면???

아래 사진처럼 제대로 바인딩이 되지 않습니다.

코틀린은 자바와는 약간 다르게

binding.executePendingBindings()

바인딩 가장 마지막에 위 코드를 넣어줘야 정상적으로 동작합니다.

package dev.cr.com.kotlindatabinding

import android.databinding.DataBindingUtil
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import dev.cr.com.kotlindatabinding.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)
val constss = Constss("HELLO WORLD!")
binding.setVariable(BR.constss, constss)
binding.executePendingBindings()
}
}

이제 정상적으로 바인딩 된 걸 볼 수 있습니다.


별로 어렵지 않죠?

이상입니다.

감사합니다.

반응형