Lumpy Space Princess - Adventure Time
공부/Android

[Android/Kotlin] ViewBinding (뷰 바인딩)

yaebb_82 2023. 4. 4.

 

 

1. ViewBinding 이란?

viewBinding뷰와 상호 작용하는 코드를 더 쉽게 작성할 수 있게 해주는 기능으로, 기존에 사용하던 findViewById를 대체하기 위한 방법이다. (findViewById는 View의 Id를 R클래스에서 받아와서 사용하는 방법이다.)

 

🤔 "findViewById를 잘 쓰고 있었는데, 왜 viewBinding으로 대체되었을까?"

 

✏️ viewBinding의 장점

1. findViewById 보다 속도가 상대적으로 빠르다.
2. 정확한 view의 타입을 찾아 맵핑해준다.
3. NullPointerException을 방지 해준다.

 

 

1)  findViewById 보다 속도가 상대적으로 빠르다.

findViewById는 모든 View의 Id 값에 접근해서 확인하게 된다. 여기서 '모든' 은 접근하고자 하는 레이아웃 뿐만 아니라 레이아웃 전체를 의미한다. viewBinding접근하고자 하는 레이아웃 안에서만 선언한 Id 값을 참조하기 때문에, 속도적인 부분에 있어서 빠르다고 할 수 있다.

 

 

2) 정확한 view의 타입을 찾아 맵핑해준다.

findViewById의 경우 타입을 작성해주어야 한다. 만약 해당 view의 타입이 <TextView>인데 <ImageView> 라고 잘못 적어주게 되면 Exception이 발생하게 된다. 하지만 viewBinding은 자동으로 cast 되어있기 때문에 Exception의 우려가 없다.

val text = findViewById<TextView>(R.id.textView)
val text = findViewById<ImageView>(R.id.textView)  // Exception 발생

 

 

3) NullPointerException을 방지해준다.

findViewById로 참조했을 때 모든 View의 Id 값에 접근은 가능하지만, 해당 레이아웃에 존재하지 않는 잘못된 Id 값을 참조하게 될 경우 NullPointerException이 발생하게 된다. 하지만 viewBinding은 잘못된 Id 값을 참조하게 되면 즉각적으로 알려주기 때문에  NullPointerException이 발생할 위험이 없다.

 

 

 

 

2. ViewBinding 사용하기

• build.gradle(:app)

android {
	...
	viewBinding {
    	enabled = true
    }
}

해당 코드를 작성한 이후, Sync Now를 눌러 viewBinding을 적용시켜준다.

 

 

• MainActivity.kt

package com.example.binding_ex

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.binding_ex.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

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

        binding = ActivityMainBinding.inflate(layoutInflater)
        val view  = binding.root
        setContentView(view)
    }
}

 

private lateinit var binding: ActivityMainBinding

- onCreate()에서 초기화하기 위해서 lateinit으로 지정한다.

 

binding = ActivityMainBinding.inflate(layoutInflater)

- viewBinding 객체를 초기화해준다.

- inflate()는 xml에 있는 view를 객체화 해주는 역할을 한다.

- 객체화 해주는 과정에서 layoutInflater가 필요하다.

 

val view  = binding.root
setContentView(view)

- setContentView()는 레이아웃을 inflating 해주는 역할을 한다.

- 기존에는 R.layout.activity_main 이런식으로 넘겨줬다면, viewBinding에서는 root뷰를 넘겨준다.

 

 

 


 

자세한 내용은 공식 문서를 참고하자.

 

뷰 결합  |  Android 개발자  |  Android Developers

뷰 결합 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 뷰 결합 기능을 사용하면 뷰와 상호작용하는 코드를 쉽게 작성할 수 있습니다. 모듈에서 사용 설정

developer.android.com

 

 

 

반응형

댓글