본문 바로가기
안드로이드

안드로이드 코틀린 - 뷰바인딩(View Binding)

by Dokon Jang 2021. 9. 25.
반응형

안드로이드 스튜디오 4.0이상에서의 뷰바인딩하는 방법입니다.

findViewById를 사용해서 뷰(View) 객체를 얻는 것보다 상당히 간편합니다.

 

1. 모듈 gradle에 뷰바인딩 클래스를 생성하도록 설정합니다.

android {
    ...
    
    buildFeatures{
        viewBinding true
    }

    ...
}

 

2. 뷰바인딩 클래스 이름 규칙은 아래와 같이 레이아웃 XML 파일의 이름에 따라 결정됩니다.

레이아웃 XML 뷰바인팅 클래스명
activity_main.xml ActivityMainBinding
item_list.xml ItemListBinding

 

3. 뷰바인딩 객체 사용하기

(1) 멤버 변수로 뷰바인딩 변수를 생성한다.

    뷰바인딩 변수는 onCreate 에서 초기화를 하기 위해서 lateinit로 지정한다.

class MainActivity : AppCompatActivity() {
    lateinit var binding : ActivityMainBinding;
    ...
}

 

(2) 뷰바인딩 객체를 초기화하고, Activity의 레이아웃(activity_main.xml)으로 설정합니다.

    뷰바인딩의 root는 레이아웃의 최상위 뷰(View)입니다.

class MainActivity : AppCompatActivity() {

    lateinit var binding : ActivityMainBinding;

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

        binding = ActivityMainBinding.inflate(layoutInflater);
        setContentView(binding.root)
    }
}

 

(3) 레이아웃의 뷰 객체를 활용하기 위해서는 뷰에 id를 지정하면 뷰바인딩의 변수명으로 사용하면됩니다.

    <TextView android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

 

class MainActivity : AppCompatActivity() {

    lateinit var binding : ActivityMainBinding;

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

        binding.textView.text = "안녕하세요.";
    }
}

 

4. 전체소스

[모듈 gradle]

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

android {
    compileSdkVersion 30

    buildFeatures{
        viewBinding true
    }

    defaultConfig {
        applicationId "com.test"
        minSdkVersion 24
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.6.0'
    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.0'

}

 

[레이아웃 XML]

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">

    <TextView android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

[코틀린]

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.dksys.visitcall.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    lateinit var binding : ActivityMainBinding;

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //setContentView(R.layout.activity_main)

        binding = ActivityMainBinding.inflate(layoutInflater);
        setContentView(binding.root)

        binding.textView.text = "안녕하세요.";
    }
}

댓글0