Android 개발에서 UI관련 파일은 크게 View를 그리는 XML과 presentation 로직을 그리는 Activity 두 가지가 있다.
이 두 파일을 ViewBinding을 통해 결합할 수 있다.
결합한다는 것은 Activity에서 XML파일의 Component를 id를 통해 참조 가능하게 하는 것이다.
findViewById -> viewBinding(v3.6) -> kotlinSynthetic(v4.1)
사실 ViewBinding을 사용하기 전에는 findViewById를 통해서 필요한 id를 받아와 변수화 시켰다. 그리고 ViewBinding이 3.6version부터 등장하게 되었다. 이어서 4.1 version에서 kotlinSynthetic이 등장하였으나 deprecated되었다.
kotlinSynthetic은 동일한 id에 대해 nullPointExeption이 발생할 수 있으며 자바는 지원을 안한다는 점에서 deprecatedrk 되었다.
이전의 findViewById에서 지금의 ViewBinding 으로 세대 교체가 이루어 진 것은 두 가지 사용 방식을 비교해보면 알 수 있다.
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/textview_id"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/textview_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/button_logout"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/button_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
XML파일에 2개의 textview와 2개의 button이 존재한다.
이 4개의 component를 activity에서 사용하기 위해 썼던 두 가지 (findViewById, viewBinding) 방식을 비교해보자.
override fun onCreate(savedInstanceState: Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val textId = findViewById<TextView>(R.id.textview_id)
val textPassword = findViewById<TextView>(R.id.textview_password)
val buttonLogout = findViewById<Button>(R.id.button_logout)
val buttonLogin = findViewById<Button>(R.id.button_login)
}
textId.text = "ID"
textPassword = "PassWord"
buttonLogout.setOnClickListener{}
buttonLogin.setOnClickListener{}
Activity에서 XML의 컴포넌트를 findViewById를 통해 접근 할 시 사용할 모든 컴포넌트에 대해 각각 변수를 선언 후 사용해야 한다.
private lateinit var binding : ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?){
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
}
binding.textId.text = "ID"
binding.textPassword = "PassWord"
binding.buttonLogout.setOnClickListener{}
binding.buttonLogin.setOnClickListener{}
viewBinding 사용을 위한 설정
app의 build.gradle
buildFeatures { viewBinding = true }
ActivityMainBinding은 viewBinding 사용 설정을 해주면 모든 XML 파일에 대해서 자동으로 생성되는 파일이다. 명명 규칙은 XML의 파일에서 를 없애고 다음에 오는 첫 글자를 대문자로 바꿔 준 후에 마지막에 Binding이 붙는다.
이 ActivityMainBinding의 root를 setContentView로 연결시켜주기만 하면 된다.
이후에 activity에서 xml의 모든 컴포넌트를 binding변수를 통해 binding.id 와 같은 방식으로 접근이 가능해진다.
결론!
FindeViewById 대신 ViewBinding 을 사용하자!!