반응형
우리는 개발을 하면서, 반복적이고 공통적인 코드를 기계적으로 코딩(Bolierplate 코드)을 하게됩니다.
그로인해 코드가 늘어나고, 간결하게 보이지 않아 코드 분석이 불편한 경험도 하게 됩니다.
이런 부분을 조금이나마 개선하고자 Base Class를 사용하게 되는데, 제가 개발할때 사용하는 BaseActivity에 대해 설명 드립니다.
일반적인 DataBinding을 사용하기 위해서 build.gradle에 아래와 설정을 추가해줍니다.
android {
...
buildFeatures {
//noinspection DataBindingWithoutKapt
dataBinding true
}
}
layout xml(activity_main.xml)은 <layout> 테그로 감싸줍니다.
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<!-- UI layout's root element -->
<androidx.constraintlayout.widget.ConstraintLayout... />
</layout>
위의 작성된 layout을 MainActivity에서 DataBinding 인스턴스로 가져옵니다.
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
}
}
위의 예시는 일반적으로 Activity에서 DataBinding 을 사용하는 경우입니다.
이제 여기서 BaseActivity를 생성하겠습니다.
abstract class BaseActivity<T: ViewDataBinding>
(@LayoutRes private val layoutId: Int): AppCompatActivity() {
protected lateinit var binding: T
override fun onCreate(savedInstanceState: Bundle?) {
beforeSetContentView()
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, layoutId)
initView()
initViewModel()
initListener()
afterOnCreate()
}
protected open fun beforeSetContentView() {}
protected open fun initView() {}
protected open fun initViewModel() {}
protected open fun initListener() {}
protected open fun afterOnCreate() {}
}
위와 같이 BaseActivity를 생성하고, MainActivity에서 상속을 합니다.
class MainActivity : BaseActivity<ActivityMainBinding>(R.layout.activity_main) {
override fun initView() {
super.initView()
binding.apply {
// TODO.
}
}
}
위와 같이 BaseActivity를 상속하고, param으로 layout resource id를 전달해주시면 됩니다.
그리고, BaseActivity에서 초기화 함수를 override 하여 사용하시면 좀더 깔끔한 개발을 할수 있지 않을까 싶습니다.
전체 코드는 아래 Github에서 확인해주세요.
반응형
'Android + Kotlin' 카테고리의 다른 글
Koin + MVVM + Coroutine + Flow 를 이용한 상세화면 만들기 (1) | 2022.01.02 |
---|---|
Android 프로젝트에 Vector Image(SVG) 추가하기 (0) | 2021.12.30 |
DataBinding을 사용한 BaseFragment 만들기 (0) | 2021.12.28 |
[Android] Ripple Effect 라운드 버튼 만들기 (0) | 2021.12.27 |
[Crashlytics] 외부 브라우저 연동시 SecurityException 수정 (0) | 2021.12.23 |