안드로이드 Base 코드

Ddudduu·2021년 11월 9일
0

Base 코드란?

안드로이드 프로젝트를 진행하다보면, 반복적으로 사용되는 코드들이 있다. 뷰 바인딩이나 데이터 바인딩 설정 코드같이 설정에 관련된 코드들은 모든 화면에 필요하기 때문에 일일이 선언해주기엔 너무 귀찮다😱

그래서! 반복적인 코드들을 모아놓고 갖다 쓸 수 있도록 Base 코드들을 만들어놓는다.


보통 base 코드들을 모아놓는 base 디렉토리를 만들어놓고 Base~~~ 코드들을 모아놓는다.
우선 Fragment 관련 base 코드만 작성해놓았다.


Base 코드를 사용하는 이유?

위에서도 써놨듯이, 반복되는 코드를 모아놓고 편리하게 쓰기 위해서! 이다.
그러나! 모든 공통 코드를 Base 코드로 만들어버리면, 결국엔 코드가 무거워지고 복잡해진다.
=> 정말 필요한 것들만 Base 코드로 만들어주자!


BaseFragment.kt

Fragment 에서 사용하는 코드들을 모아두는 곳이라고 생각하면 된다.
보통은 데이터 바인딩 설정 관련 코드들을 선언하는데 따로 AlertDialog 예제를 만들어봤다!


커스텀 다이얼로그를 띄우려면,

1️⃣ xml 화면과 연결
2️⃣ 클릭리스너 등록
3️⃣ 화면에 보이기

과정들을 반복해야하는데, 다이얼로그가 복잡해진다 = 더 귀찮다 🤦🏻‍♀️ 이므로
이 부분을 BaseFragment 에 선언해놓았다.

open class BaseFragment(@LayoutRes layoutId: Int) : Fragment(layoutId) {
  fun showDialog(titleText: String, contentText: String, okClickListener: (() -> Unit)? = null) {
    AlertDialog.Builder(requireActivity()).create().apply {
      val binding = CustomDialogViewBinding.inflate(layoutInflater, null, false).apply {
        titleLabel.text = titleText
        contentLabel.text = contentText

        okButton.setOnClickListener {
          dismiss()
          okClickListener?.invoke()
        }
        cancleButton.setOnClickListener {
          dismiss()
        }
      }
      setView(binding.root)
    }.show()
  }
}

클래스 명 앞에 open 변경자를 붙이면 상속이 가능해진다!


커스텀한 AlertDialog 는 다음과 같다.


showDialog() 함수에는 Dialog 에 띄울
제목, 내용, 확인 버튼 눌렀을때 처리할 일 (클릭 리스너) 들을 인자로 전달한다. (여기서도 뷰 바인딩을 활용할 수 있다!)

텍스트를 설정하고 클릭 리스너를 등록한 후, setView() 로 레이아웃을 설정하고
show() 로 화면에 띄운다.


BaseNavigationFragment.kt

Fragment 간 전환에 관련된 코드들을 모아놓는 Base 코드이다.

open class BaseNavigationFragment(@LayoutRes layoutId: Int) : BaseFragment(layoutId) {

  /**
   * 다른 화면으로 이동 (데이터 전달)
   */
  protected fun navigate(@IdRes actionResId: Int, bundle: Bundle? = null) {
    findNavController().navigate(actionResId, bundle)
  }

  /**
   * 다른 화면으로 이동
   */
  protected fun navigate(navDirections: NavDirections) {
    findNavController().navigate(navDirections)
  }
}

1️⃣ 다른 화면으로 이동하는 함수와
2️⃣ 데이터를 전달하며 이동하는 함수를 선언해놓았다.

기존 코드와 비교

// 기존 코드
val action: NavDirections = IntroFragmentDirections.actionIntroFragmentToMainFragment()
    binding.root.setOnClickListener {
      view.findNavController().navigate(action)
    }

화면 아무곳이나 클릭하면 intro_fragment 로 이동하는 코드이다.
매번 NavDirections 객체를 직접 navigate()에 전달해야한다.


그러나!
BaseNavigationFragment() 를 활용하면,
navigate(R.id.action_introFragment_to_mainFragment)
Navigation Graph 에서 선언했던 action의 id 만 인자로 전달하면 된다.
따로 NavDirection 을 선언할 필요가 없어서 매우 편하다!


대신, class 선언할 때
class IntroFragment : BaseNavigationFragment(R.layout.intro_fragment) { BaseNavigationFragment 를 상속받고 화면에 그릴 layout 을 인자로 전달해야한다!


결과는 다음과 같다.

intro_fragment 에서는 아무 곳이나 클릭 -> 다이얼로그 생성 -> 확인 누르면
-> main_fragment 로 전환 -> 이미지 클릭 -> 다이얼로그 생성

BaseFragment 를 사용하지 않았다면, fragment 마다 showDialog() 를 정의해줘야 했을 것이다.
이렇게 자주 쓰는 것들은 Base 코드로 모아두면 편리하당 👍🏻

profile
Android

0개의 댓글