본문 바로가기
ⓢⓣⓤⓓⓨ/ⓐⓝⓓⓡⓞⓘⓓⓢⓣⓤⓓⓘⓞ

[Android] BaseActivity와 BaseFragment

by heaven00 2022. 5. 25.
728x90

 

얘의 사용 이유?

BaseActivity, BaseFragment 를 통해 보일러 플레이트 코드(반복되는 코드)를 정리하기 위해서!

 

  • 간단히 말하자면, "코드의 중복을 줄이고 가독성을 높이기 위해"서 프로젝트의 뼈대로 사용되는 클래스이다.
  • 보통 binding이나 그 외 여러 activity/fragment 걸처 공통적으로 수행하는 코드에 대하여 초기화나 이벤트 등을 정리해둠으로서 나중에 다른 activity/fragment에서 이를 상속하여 사용한다.

 

기존 방식

class MainActivity : AppCompatActivity() {
    private lateinit var binding : ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = DataBindingUtil.setContentView(this,R.layout.activity_main)
        binding.lifecycleOwner = this
    }
}

 

하지만 이렇게 BaseActivity클래스를 만든다면

abstract class BaseActivity<T : ViewDataBinding>(
    @LayoutRes private val layoutResId: Int
) : AppCompatActivity() {
    private var _binding: T? = null
    val binding get() = _binding!!


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        _binding = DataBindingUtil.setContentView(this, layoutResId)

    }

    override fun onDestroy() {
        super.onDestroy()
    }

}

 

다음과 같은 방식으로 반복되는 코드 사용을 줄일 수 있다!

class HomeActivity : BaseActivity<ActivityHomeBinding>(R.layout.activity_home) {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

    }
}

 

 

같은 이유로 BaseFragment의 코드

abstract class BaseFragment<T : ViewDataBinding>(@LayoutRes private val layoutRes: Int) : Fragment() {
    private var _binding: T? = null
    val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = DataBindingUtil.inflate(inflater, layoutRes, container, false)
        binding.lifecycleOwner = viewLifecycleOwner
        return binding.root
    }


    override fun onDestroyView() {
        _binding = null
        super.onDestroyView()
    }

}

로 코드를 짰다!

 

그럼 이런씩으로 활용 가능!

class ProfileFragment : BaseFragment<FragmentProfileBinding>(R.layout.fragment_profile) {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

    }
}

 

어떻게 설계하는지는 본인의 마음~

 

대신

 

1. 공통적인 코드라고 무조건 Base에 넣는 것은 좋은 코드라고 할 수 없다. 이럴 경우 차라리 Util 관련 클래스를 만들어 따로 빼서 쓰는 것이 더 이상적일 것

2.  lifecycle을 꼭 지키도록 설계

3. 몇개가 만들어질지 모르는 변수들(ex : viewmodel)은 base 부분에 넣지 않는 것을 추천

728x90

댓글