본문 바로가기

Android + Kotlin

DataBinding을 결합한 BaseActivity 만들기

반응형

우리는 개발을 하면서, 반복적이고 공통적인 코드를 기계적으로 코딩(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에서 확인해주세요.

 

GitHub - rcbuilders/RemindSampleApp: https://heeeju4lov.tistory.com/ 블로그에서 Android + Kotlin 강좌에서 사용함.

https://heeeju4lov.tistory.com/ 블로그에서 Android + Kotlin 강좌에서 사용함. - GitHub - rcbuilders/RemindSampleApp: https://heeeju4lov.tistory.com/ 블로그에서 Android + Kotlin 강좌에서 사용함.

github.com

 

 

 

반응형