본문 바로가기
Android

[Android] View Binding

by Ejay 2021. 2. 1.

뷰 바인딩은 뷰와 상호작용 하는 코드를 보다 쉽게 작성할 수 있는 기능입니다.

모듈의 build.gradle에서 뷰 바인딩 속성이 활성화되면 해당 모듈에 있는 각 XML레이아웃 파일에 대한

바인딩 클래스가 자동으로 생성됩니다. 바인딩 클래스 인스턴스에는 해당 레이아웃에 ID가 있는 모든 뷰에 대해 직접적으로 참조됩니다.

 

대부분의 경우에 뷰 바인딩이 findViewById메서드를 대체할 수 있습니다.

 

ViewBinding 설정하기

뷰 바인딩은 각 모듈별로 활성화됩니다. 모듈에서 뷰 바인딩을 사용하려면 

아래의 코드와 같이 요소를 build.gradle파일에 추가합니다.

 

viewBinding {
        enabled = true
    }

추가한 뒤 sync now를 눌러 싱크를 맞춰줍니다.

 

뷰 바인딩 클래스를 생성하는 동안 레이아웃 파일을 무시하려면 아래의 속성을 레이아웃에 추가합니다.

 

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

 

ViewBinding 사용하기

 

MainActivity 부분의 코드를 아래와 같이 입력해줍니다.

 

private lateinit var binding: ActivityMainBinding
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)

Xml 파일 또한 아래와 같이 입력해줍니다.

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/ed_main"
        android:hint=" "
        />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btn_main"
        android:text="btn_main"
        />


</LinearLayout>

 

 

두 개 다 변경을 했으면 MainActivity.kt에서

 

위와 같이 입력했을 때 Xml파일에서 정해준 id가 카멜 표기법으로 변환되어 나오는 것을 확인할 수 있습니다.

 

저 같은 경우는 버튼을 눌렀을 때 EditText의 hint가 변경되게 해 보겠습니다.

 

binding.btnMain.setOnClickListener {
            binding.edMain.hint = "입력해주세요"
        }

위와 같이 입력 후 빌드를 해보면

 

버튼을 누르기 전
버튼을 누른 후

 

 

사실 위와 같이 2개 정도만 쓰는 코드였으면 findViewById가 조금 더 빠르게 제작이 가능하겠지만

2개보다 더 많은 뷰들을 다루게 되면 뷰 바인딩으로 하나하나 ID를 할당해 줄 필요가 없습니다.


ViewBinding과 findViewById의 차이점

 

findViewId()를 사용해도 액티비티 혹은 프래그먼트 내 뷰를 참조할 수 있지만 뷰 바인딩은 finViewById에 비해

다음과 같은 장점이 있습니다.

 

  • NULL Safety(널 안전)
    바인딩 클래스에서 제공하는 필드는 각 뷰를 직접 참조하게 되어있습니다. 따라서 잘못된 ID를 대입하여
    널 포인터 오류가 발생하는 등의 문제가 일어나지 않습니다. 또한 특정 구성에서만 접근할 수 있는 뷰가 있는 경우 이는 @Nullable로 표시되므로 뷰 참조 시 실수를 방지할 수 있습니다.
  • Type safety(타입 안정성) :
    바인딩 클래스 내 필드는 레이아웃 내 선언된 뷰의 타입을 갖습니다. 따라서 잘못된 타입으로 캐스팅하는 
    실수를 막을 수 있습니다

위와 같은 특성으로 인해 레이아웃과 코드 사이 일치하지 않는 부분이 있다면 컴파일 오류가 발생하게 됩니다.

따라서 앱 배포 후 발생할 수 있는 런타임 오류를 미연에 방지할 수 있습니다.

반응형

'Android' 카테고리의 다른 글

[Android] RecyclerView 사용하기  (0) 2021.02.16
[Android] ListView 사용  (0) 2021.02.15
[Adroid] Activity LiftCycle  (0) 2021.02.01
[Android] Layouts  (0) 2021.01.28