본문 바로가기
TIL/Android

[Android] 뷰 바인딩(ViewBinding)이란? / 뷰 바인딩 설정 및 사용 방법 / ViewBinding findViewById 차이점

by 왁왁s 2022. 11. 10.

Activity와 Layout을 결합하는 대표적인 방법

1. findViewById

- Android 초기부터 사용되었으며 별다른 설정없이 사용 가능하다.

- 안드로이드 리소스를 관리하는 R 클래스를 통해 View를 찾는다.

- 자동으로 형변환을 해주는 기능이 없어 직접 형변환을 해줘야 한다.

- 연결된 Layout에 존재하지 않은 View여도 앱을 실행하기 전까지 오류를 발생시키지 않는다.

 

2. ViewBinding

- 최근 가장 많이 사용되는 방법으로 XML 파일을 해석해서 객체로 변환한다.

- 자동으로 형변환을 해주어 별다른 형변환을 할 필요 없다.

- 연결된 Layout에 존재하는 View만을 가져올 수 있다.

- 초기 설정이 필요하다.

3. DataBinding

- XML 파일과 데이터를 직접 결합하는 방법이다.

- 디자인 패턴과 결합해서 사용한다.

 

 

위의 3가지 방법 중 View Binding을 알아보도록 하겠다.


View Binding(뷰 바인딩)이란?

뷰 바인딩(View Binding) 은 말그대로 뷰를 바인딩(Binding: 묶어놓다.) 하는 것인데, 레이아웃 XML 파일에 대한 액티비티 클래스를 정의하지 않고 자동적으로 뷰(View)에 대해 커넥션을 생성해주는 기능을 말한다.

 

build.gradle에서 뷰 바인딩 속성을 활성화시키면 해당 모듈에 있는 각 XML 레이아웃 파일에 대한 바인딩 클래스가 자동적으로 생성된다. 

 

ex) 액티비티 레이아웃 파일명으로 만들어지는 바인딩 클래스명

activity_main.xml ⇒ ActivityMainBinding

 

 


 

View Binding(뷰 바인딩) 사용 이유

1. 일일이 View를 찾아 findViewBy를 사용할 필요가 없으며, 형변환을 할 필요 없다.

2. 레이아웃 내에 View만을 찾아 정확한 view 타입을 매핑해, Type-Safe를 보장한다.

3. 레이아웃에 없는 id를 접근 했을 때의 NullPointerException을 방지해, Null-safe를 보장한다.

4.  오류가 나면 런타임이 아닌 컴파일시 빌드 오류를 알려준다.

 

 

 

View Binding(뷰 바인딩) 설정 및 사용

코틀린 코드에서 레이아웃 객체를 조작하기 위해서 뷰 바인딩을 한다. 

 

 

1. build.gradle 파일 수정

 

app/build.gradle (Module: ) => viewBinding 추가

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

 

우측 상단 Sync Now 클릭

 

2. MainActivity.kt 수정

package com.til.binding_ex

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

class MainActivity : AppCompatActivity() {
    private lateinit var viewBinding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(viewBinding.root)

        viewBinding.tvText.text = "456"
    }
}

 

코드 해석

private lateinit var viewBinding: ActivityMainBinding

레이아웃 정보가 클래스로 만들어지기 때문에 해당 클래스를 통해서 만들어진 객체를 담을 수 있는 변수를 생성한다.

 최대한 빠른 시일 내에 초기화 하겠다는 뜻의 lateinit var을 사용해 변수를 생성한다.

 

* ViewBinding Naming (네이밍) *

액티비티 레이아웃 파일명으로 만들어지는 바인딩 클래스명 => 자동 Naming

언더바( _ ) 가 사라지고 camel case로 변경이 된다. 

activity_main.xml ⇒ ActivityMainBinding

 

 

 

viewBinding = ActivityMainBinding.inflate(layoutInflater)

inflate()는 XML 파일을 읽어와 해석하겠다는 의미이다.

객체화한 뷰를 해석해서 읽어와 객체화를 해주는 layoutInflater가 필요하다. 

layoutInflater은 액티비티(Activity)에서 기본적으로 제공해준다.

 

setContentView(viewBinding.root)

root라는 의미는 activity_main.xml의 맨 위에 있는(root) Layout을 의미한다.

root를 가져오면 activity_main.xml의 root 레이아웃 아래 작성되어 있는 내용도 함께 가져오게 된다.

해당 명령어를 통해 해당 activity를 명령어가 작성된 MainActivity.kt에서 사용할 수 있게 된다.

 

 

3. ViewBinding 사용

레이아웃 파일에 생성해둔 뷰를 이제는 findViewById가 아닌 "binding.[뷰ID]"로 접근할 수 있다.

binding.tvTextView.text="ID가 tvTextView인 뷰 text 수정하기"

 

댓글