[Android Studio] findViewById 대신 View Binding

이도연·2023년 8월 25일
1

android studio

목록 보기
9/28

1. findViewById 대신 View Binding 을 쓰는 이유

Null Safety: findViewById 사용 시 Null Pointer Exception이 발생할 실수를 컴파일 타임에 잡아낼 수 있다.
Type Safety: findViewById 사용 시 Class Cast Exception이 발생할 실수를 컴파일 타임에 잡아낼 수 있다.

findViewById 는 ,현 파일에 존재하지 않는 View ID 를 인자로 전달할 경우 Null Pointr Exception 이 발생한다.
View 를 잘못된 타입으로 캐스팅할 시 Class Case Exception 발생한다.
태그를 순회하여 일치하는 뷰를 검색하기 때문에 속도가 저하된다.

  1. Gradle 설정
    View Binding 은 Android Studio 3.6버전에서 새롭게 등장한 기능이다. (이전 버전에선 사용 불가)
    프로젝트 최초 생성 시 viewBindin 이나 buildFeatures 속성 존재x.

아래 구문을 추가해야 한다.

// Available in Android Gradle Plugin 3.6.0
android {
    ...
    viewBinding {
        enabled = true
    }
}
// Android Studio 4.0
android {
    ...
    buildFeatures {
        viewBinding = true
    }
}

특정 레이아웃 파일을 클래스로 바인딩하고 싶지 않다면, 해당 파일 root view에 tools:viewBindingIgnore="true" 속성 추가! (네임 스페이스로 toolsNS 추가되어있어야 함)

<LinearLayout
        ...
        xmlns:tools="http://schemas.android.com/tools"
        tools:viewBindingIgnore="true" >
    ...
</LinearLayout>
  1. Activity 에 ViewBinding 적용

  2. 뷰로 사용할 바인딩 클래스의 inflate() static 메소드 호출하여 바인딩 클래스 인스턴스를 생성

  3. getRoot() 메소드 통해 root view 참조

  4. 해당 root view가 화면에 표시되도록 setContentView()를 통해 content view로 설정

class MainActivity: AppCompatActivity() {
    
    private lateinit var binding: ActivityMainBinding
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)        
        // setup instance
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        
        // use instance
        binding.name.text = viewModel.name
        binding.button.setOnClickListener {
            viewModel.userClicked();
        }
    }
}

setContentView() 메소드를 resource id와 함께 사용하면 에러가 난다.
이 경우 레이아웃은 두 번 생성되고, listener는 잘못된 레이아웃 오브젝트에 설정된다.
뷰 바인딩을 사용할 때는 setContentView(binding.getRoot())

2개의 댓글

comment-user-thumbnail
2023년 8월 25일

아직 뷰 바인딩 내용을 전부 이해하지는 못했지만 사용하니까 확실히 더 편한 것 같아요. ㅎㅎ

답글 달기
comment-user-thumbnail
2023년 8월 25일

도연님 내용은 항상 추가로 공부하게 되네요! 오늘도 수고 많으셨습니다 :)

답글 달기