[Android] ViewBinding (뷰 바인딩)

곽지욱·2024년 3월 4일

Andorid

목록 보기
4/5
post-thumbnail

1. ViewBinding 이란?

  • viewBinding 은 뷰와 상호 작용하는 코드를 더 쉽게해주는 기능으로 기존에 사용하던 findViewByid를 대체하기 위한 방법이다

findViewByid 는 View의 Id를 R클래스에서 받아와서 사용하는 방법이다.

viewBinding 의 장점

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

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

  3. NullPointerException을 방지 해준다.

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

즉 findViewById 은 레이아웃 전체를 스캔하므로 성능 면에서 비교적 느릴 수 있고 특히 대규모 레이아웃의 경우 성능 저하가 더욱 두드러질 수 있지만, viewBinding은 레이아웃 파일에서 정의된 뷰만을 스캔하므로 성능 면에서 효율적이다.

    1. findViewById 의 경우 타입을 작성해주어야 한다. 만약 해당 view의 타입이 인데 라고 잘못 적었을 경우 Exceptiom이 발셍하게 된다. 하지만 viewBinding은 자동으로 cast 되어있기 때문에 우려가 없다.
  
  val text = findViewById<TextView>(R.id.textView)
  val text = findViewById<ImageView>(R.id.textView) //Exception
  
    1. findViewById로 참조했을 때 모든 View의 Id 값에 접근은 가능하지만, 해당 레이아웃에 존재하지 않는 잘못된 Id 값을 참조하게 될 경우 NullPointerException이 발생할 가능성이 있지만 viewBinding의 경우 즉각적으로 확인이 가능하기 때문에 오류 발생 위험이 없다.

2.ViewBinding 사용하기

  • build.gradle(:app)
  
android{
  ...
  viewBinding{
  enable = true
  }
  
}
  • 작성한 뒤 Sync Now 를 누른다.
  • Activity
  
package com.example.tutorial

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.tutorial.databinding.ActivityViewBindingBinding

class ViewBindingActivity : AppCompatActivity() {
    
    private lateinit var binding:ActivityViewBindingBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        binding = ActivityViewBindingBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
        
    }
}
  • binding 객체를 생성하기 위해서는 'onCreate' 메서드에서 inflate 메서드를 호출해야 한다. 이렇게 하기 위해서는 super.onCreate(saveInstanceState)가 호출된 이후여야 하는데, lateinit 을 사용함으로써 이를 가능하게 하는 것이다
  • 액티비티의 생명주기와 관련있는 것이다. binding 객체를 생성하려는 코드를 onCreate 메서드 이전에 위치 하였기 때문이다 액티비티가 생성되는 동안 다양한 상태 변화가 발생할 수 있는데,
  • 예를 들어 시스템은 메모리가 부족할 경우 액티비티를 제거하고 나중에 다시 생성할 수 있다. 이 경우에 onCreate() 메서드가 다시 호출될 수 있는데, 이전에 binding 객체를 초기화 했다면 다시 초기화 되지 않고 여전히 사용 가능한 상태로 남아있게 된다. 이러한 생명주기와 관련된 문제를 방지하기 위하여 lateinit 을 사용한다.

binding = ActivityViewBindingBinding.inflate(layoutInflater)

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

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

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

val view = binding.root
setContentView(view)

  • setContentView()는 레이아웃을 inflating 해주는 역할을 한다.
  • 기존에는 R.layout.activity_main 이런식으로 넘겨줬다면 viewBinding 에서는 root 뷰를 넘겨주는 것이다.

0개의 댓글