[Android] viewBinding으로 깔끔한 코드 만들기

유재민·2022년 4월 23일
4

🤷🏻‍♀️ View binding 이란?

findViewById 를 쓰지 않고, XML의 view component에 접근하는 object를 반환받아
view에 접근하는 방식이다.
👉🏻 단순히 findViewById를 대체하기 위한 방법으로만 사용된다.

💡 장점

  1. findViewById로 없는 id의 view를 찾아오는 경우 null반환 문제 해결 (null-safety)
  2. 반환 타입이 일치하지 않을 때 exception 발생 문제 해결 (type-safety)
  3. 뷰의 개수대로 코드를 추가 할 필요 없음

view binding vs data binding

  • 둘 다 같은 모듈에서 동시 사용 가능
  • view binding의 속도가 더 빠름
  • view binding은 양방향 데이터 바인딩 지원 x

👩🏻‍🏫 양방향 데이터 바인딩?

viewModel의 데이터를 layout에 연결하여 UI에 바로 나오게끔 하면서,
반대로 화면에서의 입력이 viewModel의 데이터에 영향을 주는 연결 방식


👨🏻‍💻 구현

1. build.gradle에서 enable

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

안드로이드 버전에 따라 코드를 추가해준다.
Sync Now 를 누르게 되면 모든 layout에 대해서 binding object가 생성된다.
binding object는 id를 갖는 모든 view들을 하나의 property로 가진다.

2. Activity에서 binding 선언

private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
    }

3. Fragment에서 binding 선언

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val binding = FragmentSettingBinding.inflate(inflater, container, false)
    
    return binding.root
}

4. xml id 접근

binding.textView.text = "Hello, World!"

xml 이름이 카멜 표기법으로 변경되어 코드에 사용된다.


🙋🏻‍♀️ Why view binding?

위 그림에서 보시다시피 다른 라이브러리에 비해 view binding의 장점이 더 많은 것을 확인할 수 있다.
필자는 이전에 findViewById 선언 없이 xml id에 바로 접근할 수 있도록 하는 kotlin synthetics을 사용했었는데 어떤 이유에서 deprecated 됐을까?

kotlin synthetic deprecated?

  1. 전역 네임 스페이스 오염
  2. 다른 레이아웃의 동일한 id를 가져올 때 NullPointException 발생
  3. kotlin만 지원

위와 같은 문제때문에 deprecated 되었으니, view binding을 사용하길 권장한다.


view binding 에 대해서 알아보았는데, 이전에 공부를 하지않고 무작정 쓰던때와 다르게 써야되는지 알면 확실히 더 잘 이해할 수 있는 거 같다.

잘못된 부분 수정이나 질문은 언제든 남겨주세요 ~ 😁

View Binding
Android view binding (뷰 바인딩)
안드로이드 뷰 바인딩(view binding)

profile
유잼코딩

0개의 댓글