[Android] ViewBinding

HEETAE HEO·2022년 4월 27일
0

Android

목록 보기
5/12
post-thumbnail

글의 시작전 이미지 사진을 하나 보면 제목은 뷰에 접근하는 방법에서 총 5가지의 방법이 나옵니다.

1.이전의 글에서 소개를 했던 findViewById()입니다. 해당 기능에 대해서 궁금하시다면 이 전글들을 읽어주시면 findViewById()에 대해 아실 수 있습니다.

2.DataBinding의 경우 다음 글의 주제가 될 기능이기에 다음에 소개를 하겠습니다.

3. 다음은 Butterkinfe입니다. Bufferkinfe라는 오픈소스 라이브러리를 이용하여 View에 접근한다고 합니다. 장점으로는 형변환에 대해 작업을 해줄필요가 없고 코드의 가독성이 높아 많이 사용했다고 합니다. 하지만 DataBinding이 나오게 되면서 사용이 많이 줄어들게 되었고 공식적으로 deprecated되며 DataBinding의 사용을 더 강조되었습니다.

4. Koltin Synthetic입니다. 이것도 공식적으로 decreated되었고 간단하게 설명을 하자면
빌드코드만 작성을 한다면 소스파일에서 추가 코드를 작성하지 않아도 사용할 수 있었으며 import역시 자동으로 알맞은 레이아웃 파일을 해준다. 그런데 왜 decreated되었을까?
RecyclerView의 ViewHolder 사용 시 문제점 findViewById의 가장 큰 단점은 똑같은 코드를 생성해야하는 만큼 반복해 성능의 저하를 시키는 것인데 Kotlin Synthetic또한 같았던 것이다. 그리고 View가 동일한 id를 가지는 경우 null 안정성에도 문제가 생겨 이슈가 발생할 가능성 높기 때문에 decreated되었다.

5. ??? 는 바로 이번 글에서 다룰 ViewBinding이다.

ViewBinding

ViewBinding은 각 XML 레이아웃 파일의 Binding 클래스를 생성한다. Binding 클래스의 인스턴스에서 레이아웃 ID가 있는 모든 View의 직접참조를 할 수 있다.

findViewById의 경우 xml 파일의 TextView 접근하고자 한다면 코드는 다음과 같을 것이다.

val textview = findViewById<TextView>(R.id.test_view)
	textview.text = " 변경할 text " 
val textview2 = findViewById<TextView>(R.id.test_sub)
	textview2.text = " 변경할 text2 " 

반면 코드의 단순성을 보여주기 위해 ViewBinding을 사용하기 위해 설정이 다 되어있다는 가정하에 코드는

val binding = ActivityMainBinding.inflate(layoutInflater)
binding.textview.text = " 변경할 text " 
binding.textview2.text = " 변경할 text2"

이렇게 바뀌게 된다. 모든 layout에 대해 Binding object가 생성되고 Binding object는 id를 갖는 모든 View들을 하나의 property로 가집니다. 그렇기에 type도 알아서 맞춰주고 null도 발생하지 않습니다.

ViewBinding 사용 시 주의점

   override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
        initState()
    }

Actvity에서 setContentView를 선언할 때 반드시 binding.root로 해야한다.
만약 기존의 방식인 R.layout.activity.main을 넘겨준다면 두 번의 layout inflate를 하게 되고 inflate 되는 root와 layout object는 서로 다른 객체이므로 각각 다른 View를 가리키게 되고 원하는 동작이 발생하지않는다.

Binding object

3가지의 static function이 존재한다.

  1. inflate(inflater) : Activity의 onCreate에서 사용하며, parent view로 넘길 것이 없을 경우 사용한다.

  2. inflate(inflater, parent, attachToParent) : Fragment나 RecyclerView의 Adapter 또는 ViewHolder 처럼 parent ViewGroup을 넘겨야 하는 경우 사용한다.

  3. bind(rootView) : 이미 View를 inflate한 상태에서 findViewById를 피하고 싶거나 기존 코드를 refactoring할 때 유용하게 사용할 수 있다.

마치며

ViewBinding은 findViewById를 대체하기 위한 방법으로만 사용된다. 그렇기에 DataBinding과 ViewBinding을 같은 모듈에서 사용할 수 있다.

마지막 사진을 보면 다른 메서드들에 비해 null 안정성 , type안정성 및 boiler코드 까지 줄여주는 효과가 있으니 findViewById보다는 ViewBinding을 쓰는 것을 추천한다.

profile
Android 개발 잘하고 싶어요!!!

0개의 댓글