-
💡 [Android/Kotlin] 뷰바인딩(viewBinding) 어떻게 쓰고, 왜 쓰는가? (ft. kotlin-android-extensions)| 프로그래밍 분야/안드로이드 2021. 6. 22. 22:58
💡 사용 방법
1) build.gradle(:app) 세팅
android { ... viewBinding { enabled = true } ... }
2) MainActivity.kt 세팅 (Inflate하려는 리소스파일의 이름 : example_res.xml)
class MainActivity : AppCompatActivity() { private lateinit var binding: ExampleResBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ExampleResBinding.inflate(layoutInflater) setContentView(binding.root) } }
보통의 경우 MainActivity의 onCreate 메서드에서는 activity_main.xml 파일을 inflate하므로, 이를 카멜표기법으로 바꾼 ActivityMainBinding 클래스로 바인딩 객체를 생성하면 됩니다.
3) 바인딩 객체를 통한 뷰 참조 (예시)
binding.button.setOnClickListener { binding.textView.setText("입력한 값 : ${binding.editTextTextPersonName.text.toString()}") }
etc) 액티비티가 아닌 프래그먼트에서 뷰를 참조할 경우
private var _binding: ExampleResBinding? = null // nullable 설정은 프래그먼트의 onCreateView와 onDestroyView에서만 사용 private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { _binding = ExampleResBinding.inflate(inflater, container, false) val view = binding.root return view } override fun onDestroyView() { super.onDestroyView() _binding = null }
이후 액티비티의 경우와 마찬가지로 바인딩 객체를 통한 뷰 참조가 가능합니다.
💡 기존의 방법
Kotlin 1.4.20 이전 버전에서, 우리는 자바의 findViewById 메서드를 대체하는 편리한 수단으로, build.gradle(:app)에 'kotlin-android-extensions' 플러그인을 import하여 액티비티 - 리소스 파일 자동 id 매칭을 이용해왔습니다.
(소위 말하는 Kotlin Synthetic)
하지만 이에는 몇가지 문제점이 있었습니다.
1. 다른 리소스 파일의 뷰에서 같은 id를 사용했을 시, Error 발생
2. Kotlin Synthetic의 장점은 캐싱을 통한 재사용성 증가 but, ViewHolder에서는 캐싱을 지원하지 않음 (내부적으로 단순히 findViewById가 사용됨)
3. 코틀린에서만 지원 (자바와의 호환 불가)
Reference
https://developer.android.com/topic/libraries/view-binding#kotlin
https://velog.io/@deepblue/Kotlin-Android-Extensions%EC%9D%B4-deprecated%EB%90%9C-%EC%9D%B4%EC%9C%A0