나는 주로 ViewBinding을 사용해서 개발을 진행하는데, Activity나 Fragment에서 공통적으로 만들어줘야하는 것들이 있다. 바로 ViewBinding을 설정해 주는 작업이다. 항상 UI단에 적용해 줘야해서 매우 귀찮은 작업이었다.
이를 해결하고자 base를 만들어 필수적으로 Activity나 Fragment에 상속하여 사용할 수 있도록 한다!
package com.secretdiary.base
/ ... /
abstract class BaseActivity<T : ViewBinding>(val bindingFactory: (LayoutInflater) -> T) : AppCompatActivity() {
private var _binding: T? = null // abstract class에서만 사용될 프로퍼티
val binding get() = _binding!!
// 외부에서 사용될 프로퍼티
// 프로퍼티에 접근할 때 마다 프로퍼티가 값을 매번 계산.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
_binding = bindingFactory(layoutInflater)
// bindingFactory는 외부에서 들어온 ActivityXXXBinding
// binding 프로퍼티는 get()으로 인해 외부에서 들어온 ActivityXXXBinding으로 초기화.
setContentView(binding.root)
}
override fun onDestroy() {
super.onDestroy()
_binding = null
}
}
프로퍼티 bindingFactory의 타입을 람다 타입으로 설정하여 매개변수로 LayoutInlfater를 받고 T를 리턴한다. 여기서 T는 ViewBinding타입이다. ex) ActivityXXXBinding
package com.secretdiary
/ .. /
class MainActivity : BaseActivity<ActivityMainBinding>({ActivityMainBinding.inflate(it)}) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
bindingFactory의 인자로 ActivityMainBinding.inflate(it)가 들어간다.
→ 여기서 T는 ActivityMainBinding 이다.
나머지 설명은 BaseActivity의 주석처리된 부분을 보면 됨!