ViewBinding을 사용하면 View와 상호작용 하는 코드를 쉽게 작성할 수 있다.
위 내용은 안드로이드 공식문서에 나와있는 내용이다.
ViewBinding(DataBinding, Kotlin Extensions 등등..)을 사용하지 않는다면
val btnLogin = findViewById<Button>(R.id.btnLogin)
btnLogin.setOnClickedListener{...}
와 같은 방식으로 코드를 작성했다.
이때, Button이 10개, 20개... TextView가 20개... 와 같은 식으로 늘어난다면 findViewById 코드를 n번 반복해서 작성해야 한다.
ViewBinding은 findViewById와 같은 반복적인 코드를 제거해줄 수 있다.
android{
...
viewBinding{
enabled = true
}
}
(2023.01.20 기준 안드로이드 공식문서에는 위와 같이 나와있다.
https://developer.android.com/topic/libraries/view-binding?hl=ko)
android{
...
buildFeatures{
viewBinding true
}
}
(다른 블로그 글들을 참고했을 때, 위와 같이 나와있는 글도 많아 직접 실행시켜보니 두 코드다 문제 없이 작동한다.)
<Layout>
<Button
android:id="@+id/btn1"
...
/>
</Layout>
위와 같이 id를 btn1으로 하는 Button 하나를 생성한다.
...
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)
binding.btn1.setOnClickListener {
...
}
}
}
이제 MainActivity.kt 내에서 activity_main.xml 내의 id가 부여된 view에 대해 findViewById가 아닌 binding.{id}로 접근할 수 있다.
class TestFragment : Fragment() {
private var _binding: FragmentTestBinding? = null
private val binding get() = _binding!!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentTestBinding.inflate(inflater, container, false)
val view = binding.root
return view
}
}
이제 fragment_test.xml내의 id가 부여된 view에 대해 binding.{id}로 접근하여 사용할 수 있다.
MVVM, LiveData 등을 사용하면서 DataBinding은 몇번 사용해봤지만 ViewBinding은
'아 이런게 있구나' 하고 넘어가는 정도였다. 상황에 따라 ViewBinding과 DataBinding중 적절한 상황이 있다는데 그 부분에 대해서는 DataBinding을 정리하면서 같이 공부 해봐야겠다.