뷰 바인딩(View Binding)

Anna·2024년 7월 16일
0

[TIL]Android

목록 보기
27/34
post-thumbnail

뷰 바인딩(View Binding)이란

  • View Binding은 View와 상호작용하는 코드를 쉽게 해주는 기능이다.
  • View Binding을 허용하면 각 xml레이아웃마다 Binding 클래스를 자동으로 생성하는데,
  • 레이아웃에 ID가 있는 View에 직접 참조를 할 수 있다.
  • 대부분의 상황에서 View Binding은 findViewById를 대체한다.

findViewById와의 차이점

View 결합에는 findViewById를 사용하는 것에 비해 다음과 같은 중요한 장점이 있다.

  • Null 안전성(null-safety)
    • View 결합은 View의 직접 참조를 생성하므로 잘못된 View ID로 인해 null 포인터 예외가 발생할 위험이 없다.
    • 또한 View가 레이아웃의 일부 구성에서만 존재하는 경우 결합 클래스에 참조가 포함된 필드가 @Nullable로 표시된다.
  • 유형 안전성(type-safety)
    • 각 바인딩 클래스의 필드에는 XML 파일에서 참조하는 View와 일치하는 유형이 있다. 즉, 클래스 변환 예외가 발생할 위험이 없습니다.
    • 쉽게 말하면, 타입을 가지고 있기 때문에 imageView.text 같이 타입이 다른 경우 발생하는 오류를 방지할 수 있다.

이러한 차이점은 레이아웃과 코드 간의 비호환성으로 인해 런타임이 아닌 컴파일 시간에 빌드가 실패한다는 것을 의미한다.

즉, 컴파일에서 빌드가 실패하므로 우리가 오류를 찾기 더 쉽다.

설정

뷰 바인딩은 모듈별로 사용 설정된다.

→ 모듈 수준 build.gradle 파일에서 viewBinding 빌드 옵션을 true로 설정

android {
    ...
    buildFeatures {
        viewBinding = true
    }
}

viewBinding은 gradle에 설정하는 것 만으로 개발자가 작성한 레이아웃 파일들을 다음과 같은 공식으로 모두 바인딩클래스로 자동변환 해줌

<!-- 자동변환공식 : 레이아웃파일명(첫 글자와 언더바 다음영문을 대문자로 변환) + Binding -->
<!-- 예) -->
activity_main.xml = ActivityMainBinding
activity_sub.xml = ActivitySubBinding
item_recycler.xml = ItemRecyclerBinding

특정 파일 무시

tools:viewBindingIgnore="true" 속성을 레이아웃 파일의 루트 View에 추가

<LinearLayout
        ...
        tools:viewBindingIgnore="true" >
    ...
</LinearLayout>

👀 tools:viewBindingIgnore="true"

속성은 Android의 View Binding 기능을 사용할 때,
특정 XML 레이아웃 파일을 View Binding이 무시하도록 지시하는 것
View Binding을 사용하면 각 XML 레이아웃 파일에 대해 결합 클래스가 자동 생성되는데,
때로는 특정 상황에서 이 생성을 원하지 않을 수 있다.

Activity에서 View Binding 사용

Activity에 사용할 결합 클래스 인스턴스를 설정하려면 onCreate()메서드에서

  1. 생성된 클래스에 포함된 정정 inflate() 메서드를 호출

    그러면 Activity에서 사용할 결합 클래스 인스턴스가 생성됨

  2. getRoot() 메서드를 호출하거나 Kotlin 속성 문법을 사용하여 루트 뷰 참고를 가져온다.

  3. 루트 뷰를 setContentView()에 전달하여 화면의 활성 뷰로 만듬

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

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

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

        binding.myButton.setOnClickListener{
            binding.myTextView.text = "바인딩이 잘 되네요!"
        }
    }
}

inflate()

xml 레이아웃 파일을 메모리에 로드하고, 그 안에 있는 모든 뷰들을 결합 클래스의 인스턴스로 반환

getRoot()

로드된 XML 레이아웃의 루트 뷰(root view)를 가져옴

Kotlin 속성 문법

속성(property)문법을 사용하여 루트 뷰에 직접 접근할 수도 있다.

setContentView()

Activity나 Fragment에서 화면에 표시할 뷰를 설정할 때, 

setContentView() 메서드를 호출하거나

Fragment에서는 onCreateView() 메서드에서 반환하는 뷰를 설정

이 때, 결합 클래스에서 가져온 루트 뷰를 setContentView()에 전달하거나 Fragment에서 반환하여 화면에 해당 뷰를 표시함

👀 로드된 XML 레이아웃의 루트 뷰(root view)를 가져온다

로드

xml 파일을 메모리에 읽어오는 것을 의미한다.
Android 애플리케이션에서는 XML 레이아웃 파일에 UI 요소들을 정의하고,
이를 앱에서 실제로 사용하기 위해서는 이 파일을 메모리에 로드해서 뷰 객체로 변환해야 함

로드 과정

  • XML 파일 읽기 : View Binding을 사용하면 Android 시스템이 지정된 XML 레이아웃 파일을 읽어와서 뷰 객체로 변환.
    이 과정에서 XML 파일의 내용을 이해하고 각 요소들을 식별한다.
  • 뷰 객체 생성 : XML 파일을 메모리에 로드하면, 각 UI 요소(버튼, 텍스트뷰 등)들은 뷰 객체로 생성됨.
    이들 뷰 객체는 앱에서 직접적으로 조작할 수 있는 UI 요소다.

루트 뷰(root view)

xml 레이아웃 파일에서 가장 상위에 있는 뷰를 말한다.
예) LinearLayout, ConstraintLayout 같은 레이아웃 요소가 있을 때
이들의 레이아웃 파일의 상위 계층을 형성하며 앱 화면의 기본 구조를 결정


결론

ViewBinding을 사용하여 xml파일을 메모리에 로드하고,
그 파일의 가장 상위에 있는 뷰 객체(일반적으로는 레이아웃 요소)를 참조한다는 의미.
이 뷰 객체를 통해 앱에서 해당 레이아웃을 구성하고,
필요에 따라 내부의 다른 뷰들에 접근하거나 조작할 수 있다.

0개의 댓글