Android/AndroidStudio

[Android] View Binding (뷰 바인딩)

앱의노예 2023. 7. 12. 20:22

1.View Binding이란?


View Binding은 View와 상호작용하는 코드를 더 쉽게 작성할 수 있게 해 주는 기능이다

Modul에서 View Binding이 활성화되면 해당 모듈에 있는 각 XML layout 파일에 대한 바인딩 클래스를 생성한다

바인딩 클래스의 객체(인스턴스) 안에는 해당  layout에 ID를 갖고 있는 모든 View들에 대한 참조변수가 있기 때문에 findViewById() 함수를 사용하지 않아도 XML파일에 등록된 뷰 객체를 쉽게 사용할 수 있다

View Binding의 장점은 뷰의 직접 참조를 해서 유효하지 않은 뷰 ID로 인해 null 포인터 예외가 발생할 위험이 없다는 것이다

또한 레이아웃의 일부 구성에만 뷰가 있는 경우 바인딩 클래스에서 참조를 포함하는 필드는 @Nullable로 표시하며, 각 바인딩 클래스에 있는 필드의 유형이 XML 파일에서 참조하는 뷰와 일치하므로 변환 예외가 발생할 위험이 없다

Data Binding보다 빠르고 사용하기 쉽다는 이점을 갖고 있으나 XML 레이아웃 파일에서 직접 동적 UI 콘텐츠를 선언할 수 없고 단방향 데이터 결합만을 지원하므로 단순하게 프로젝트를 구성할때 적합하다

 

https://developer.android.com/topic/libraries/view-binding?hl=ko 

 

뷰 결합  |  Android 개발자  |  Android Developers

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

developer.android.com

2. build.gradle (Module)


android {
    buildFeatures {
        viewBinding true
    }
}

android {
    viewBinding {
        enabled = true
    }
}

build.gradle(Module: app)에서 viewBinding을 허용한다

buildFeatures, viewBinding 중 하나를 골라 작성하면 허용이 가능하다

3. 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    tools:viewBindingIgnore="true">

Data Binding과 달리 XML에 딱히 작성할 내용이 없다

build.gradle 파일에 View Binding을 허용하면 레이아웃 XML 하나당 바인딩 클래스가 만들어지는데 tools:viewBindingIgnore="true"라는 속성을 추가하면 해당 XML파일은 바인딩 클래스를 만들지 않는다

Cannot access 'no_name_in_PSI_3d19d79d_1ba9_4cd0_b7f5_b46aa3cd5d40' 
which is a supertype of 'com.example.myapplication.databinding.ActivityMainBinding'. 
Check your module classpath for missing or conflicting dependencies

DataBinding을 사용할 때처럼 layout으로 XML을 감싸면 위의 에러가 나올 수 있다

layout을 지우면 간단하게 해결된다

4. Kotlin 파일


class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

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

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

        binding.testBinding.setOnClickListener{
            println("Test")
        }
    }
}

레이아웃 XML파일에 등록된 뷰 객체를 포함하는 클래스는 자동으로 만들어지며 첫 글자와 밑줄(_) 뒤에 오는 단어를 대문자로 만들고 'Binding'을 추가해 생성된다

만들어진 클래스의 inflate() 함수에 layoutInflater 인자를 넣어 호출하면 바인딩 객체를 얻을 수 있다

바인딩 객체의 root 프로퍼티에는 XML의 루트 태그 객체가 자동으로 등록되므로

setContentView() 함수에 binding.root를 전달하면 View Binding을 사용할 수 있다

바인딩 객체에 등록된 뷰 객체명은 XML파일에 등록한 뷰의 id값에 따르므로 XML에 작성한 값 그대로 사용하면 된다