스팀 앱 개발기 #8 - BaseFragment 클래스 정의 그리고 기존 프래그먼트들에 적용

이번 포스트에서는 BaseFragment 클래스를 정의하고 기존 프래그먼트들에 이 클래스를 적용할 것입니다.


BaseFragment 클래스를 정의하는 이유

기존 세 프래그먼트들인 TagsFragment, ProfileFragment, WalletFragment 클래스들의 코드를 보면, 중복된 코드들이 있음을 알 수 있습니다. 나중에 새로운 프래그먼트들을 추가하면 이런 중복 코드들이 또 만들어집니다. 그런데 중복 코드는 가독성이 떨어질 뿐만 아니라 코드 관리에도 어려움이 있습니다. 가능한 공통 코드를 만들어서 이를 가져다 쓰게끔 하는 것이 보다 효율적인 개발입니다. 기존 프래그먼트들에서 공통적으로 만들어지는 코드는 BaseFragment 클래스에 모아두고자 합니다. 기존 프래그먼트들은 BaseFragment를 상속받으면 됩니다.


BaseFragment 정의

지금은 프래그먼트들이 복잡하지 않아 작업내용이 많지는 않습니다. 작업 내용은 다음과 같습니다.

  • abstract 키워드: 이 프래그먼트로 바로 화면 구현은 하지 않으므로 이 키워드 사용
  • VDB: 하위 프래그먼트의 바인딩 객체의 데이터 타입
  • VM: 하위 프래그먼트의 뷰모델 객체의 데이터 타입
  • layoutResID: 하위 프래그먼트의 화면을 구성할 레이아웃 XML 파일의 ID
  • onCreateView: layoutResID 활용하여 화면 생성
  • onDestroyView: 기존 프래그먼트들의 동일 메소드에 작성된 중복 코드를 이 메소드로 옮김
abstract class BaseFragment<VDB: ViewDataBinding, VM: ViewModel>(
    @LayoutRes private val layoutResID: Int
) : Fragment() {

    private var _binding: VDB? = null
    protected val binding get() = _binding!!

    abstract protected val viewModel: VM

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = DataBindingUtil.inflate(this.layoutInflater, layoutResID, null, false) as VDB
        return binding.root
    }

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

}

다른 프래그먼트들에 BaseFragment 적용

TagsFragment에 BaseFragment를 적용해 보겠습니다. 작업 내용은 다음과 같습니다.

  • TagsFragment가 BaseFragment를 상속 받음
  • viewModel 필드: TagsViewModel 객체 생성. by lazy 활용하여 이 필드 접근시 생성시킴.
  • onCreateView 메소드: 화면 초기화 진행, 바인딩 객체의 viewModel 변수 설정
  • onDestroyView 메소드: 제거. BaseFragment의 그것이 대신함.
class TagsFragment : BaseFragment<FragmentTagsBinding, TagsViewModel>(R.layout.fragment_tags) {

    override val viewModel by lazy {
        ViewModelProvider(this).get(TagsViewModel::class.java)
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return super.onCreateView(inflater, container, savedInstanceState).apply {
            binding.viewModel = viewModel
        }
    }

}

나머지 ProfileFragment, WalletFragment 클래스들도 동일한 방식으로 BaseFragment를 적용하였습니다.


GitHub Commit


지난 스팀 앱 개발기

Sort:  
 2 years ago 

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Upvoted! Thank you for supporting witness @jswit.
default.jpg

You've got a free upvote from witness fuli.
Peace & Love!

Coin Marketplace

STEEM 0.18
TRX 0.14
JST 0.029
BTC 57893.29
ETH 3130.56
USDT 1.00
SBD 2.44