[2024. 01. 04] 뷰 바인딩(View Binding)

Gahyeon Lee·2024년 1월 5일
0

TIL

목록 보기
39/47
post-thumbnail

🥯 뷰 바인딩(View Binding)

지금까지는 xml의 위젯들의 id를 activity의 코드와 연결할 때 findfindViewById<>()를 썼는데, 이를 대체하기 위해 나온 뷰 바인딩을 쓰면 좀 더 편하게 위젯을 연결시킬 수 있다.

1. 뷰 바인딩이란?

  • 뷰 바인딩 기능을 사용하면 뷰와 상호작용하는 코드를 쉽게 작성할 수 있다.
  • 모듈에서 사용 설정된 뷰 바인딩은 모듈에 있는 각 XML 레이아웃 파일의 결합 클래스를 생성한다.
  • 바인딩 클래스의 인스턴스에는 상응하는 레이아웃에 ID가 있는 모든 뷰의 직접 참조가 포함된다.
  • 대부분의 경우 뷰 바인딩이 findViewById를 대체한다.

2. findViewById와의 차이점

  • id를 직접 치지 않아도 되고, 타입도 선언하지 않아도 된다.
  1. Null Safety

    • 뷰 바인딩은 뷰의 Direct References 즉 직접 참조를 생성하기 때문에(앱이 레이아웃의 각 뷰를 직접 참조할 수 있게 해주는 안전한 코드를 자동으로 생성) 유효하지 않은 뷰 ID로 인해 NullPointerException이 발생할 위험이 없다.
    • 즉, 레이아웃에 아직 생성되지 않은 뷰의 참조를 얻어(null 상태) 해당 뷰의 속성을 사용하려 할 때 발생하는 NPE을 방지한다는 것이다. 예를 들어, 만약 레이아웃에 버튼이 있어야 하는데 아직 버튼이 생성되지 않았다면, 뷰 바인딩은 이를 안전하게 처리하여 앱이 충돌하지 않도록 한다. 또한, 만약 레이아웃의 일부만 뷰가 있다면, 뷰 바인딩은 해당 뷰가 '가능성 있는 null'(Nullable)임을 알려주어, 개발자가 더 주의 깊게 코드를 작성하도록 돕는다.
    • 또한 레이아웃의 일부 구성에만 뷰가 있는 경우 결합 클래스에서 참조를 포함하는 필드가 @Nullable로 표시된다.
  2. Type Safety

    • XML 레이아웃 파일에서 정의된 뷰의 타입과 자동 생성된 바인딩 클래스의 필드 타입이 항상 일치하기 때문에, 타입이 서로 맞지 않아 발생할 수 있는 오류를 방지한다.
    • 예를 들어, 이미지 뷰(ImageView)에 텍스트를 설정하려고 하면 오류가 발생할 텐데, 뷰 바인딩을 사용하면 이런 실수를 할 가능성이 없어진다. 즉, 이미지 뷰는 이미지 뷰로, 텍스트 뷰는 텍스트 뷰로만 사용되게 하여, 잘못된 타입 사용으로 인한 오류가 발생하지 않도록 보장한다.

3. 뷰 바인딩 설정과 사용

1. gradle 설정
버전에 맞게 gradle을 설정해 준다.

android{
	...
   
   // AndroidStudio 4.0 ~
   buildFeatures{
   	viewBinding = true
   }
   
   // AndroidStudio 3.6 ~ 4.0
   viewBinding{
   	enabled = true
   }
}

2. Activity 설정
항상 MainActivity에 아래와 같이 설정해놓고 시작한다.
inflate는 xml에 있는 뷰를 객체화해준다고 생각하면 된다.
원래는 R.layout.activity_main를 넘겨주지만, binding을 사용하면 생성한 루트 뷰를 넘겨준다.

class MainActivity : AppCompatActivity() {

   private lateinit var binding: ActivityMainBinding
   
   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)

       binding = ActivityMainBinding.inflate(layoutInflater)
       val view = binding.root

       setContentView(view)
   }
}

3. 사용
binding.~~
binding된 객체 안에 있는 id에 접근하여 사용한다.

...
   setContentView(view)

   binding.myButton.setOnClickListener{
       binding.myTextView.text = "바인딩 완료!"
}

4. 바인딩 객체의 이름
뷰 바인딩 기능을 사용할 때, 안드로이드 스튜디오는 레이아웃 파일의 이름을 기반으로 한 바인딩 클래스를 자동으로 생성한다. 이 클래스는 레이아웃에 있는 모든 뷰에 대한 참조를 포함하며, 이를 통해 코드에서 직접 뷰에 접근할 수 있게 해준다. 바인딩 객체의 이름은 레이아웃 파일 이름에 'Binding'을 붙여 만들어진다.

예를 들어:
- 레이아웃 파일 이름이 activity_main.xml인 경우, 생성되는 바인딩 클래스의 이름은 ActivityMainBinding이 된다.
- 레이아웃 파일 이름이 fragment_home.xml인 경우, 생성되는 바인딩 클래스의 이름은 FragmentHomeBinding이 된다.

profile
코린이 강아지 집사🐶

0개의 댓글