IT 프로그래밍-Android

BottomSheetDialog MVVM(ViewModel, Databinding) 적용방법

godsangin 2020. 9. 23. 14:49
반응형

안녕하세요. 오랜만에 글로 찾아뵙습니다 !

 

오늘은 BottomSheetDialog에 MVVM 패턴을 위한 ViewModel 적용 방법에 대해 알아보도록 하겠습니다.

 

평소 Dialog는 중앙에 출력되는 것을 많이 볼 수 있었는데요 안드로이드 Pie 버전부터는 시스템 애플리케이션 Dialog가(주로 권한 요청) 화면의 최하단에 고정된 것을 종종 볼 수 있습니다. 따라서 현재 진행중인 프로젝트에서는 BottomSheetDialog를 적용해보기로 했습니다. 하지만 BottomSheetDialog에 MVVM을 적용한 예제를 좀처럼 찾아보기 힘들어 제가 작성한 코드를 공유드리려고 합니다.

 

우선 제가 작성한 예제에서는 BottomSheetDialog를 Fragment로 작성한다는 점 유의하시면 되겠습니다.

 

첫번째로 BottonSheetDialogFragment를 정의합니다 !

 

class BottomSheetDialogFragment(private val viewModelFactory: ViewModelProvider.Factory) :BottomSheetDialogFragment(){
    @SuppressLint("RestrictedApi")
    override fun setupDialog(dialog: Dialog, style: Int) {
        super.setupDialog(dialog, style)
        val binding = DialogCategoryBinding.inflate(LayoutInflater.from(context))
        val categoryDialogViewModel = ViewModelProviders.of(this, viewModelFactory)[CategoryDialogViewModel::class.java]
        binding?.lifecycleOwner = this
        binding?.model = categoryDialogViewModel
        dialog.setContentView(binding.root)
        val owner = this
        categoryDialogViewModel.apply {
            ...//observing your viewmodel using owner
        }
    }
}

 

여기서 viewModelFactory는 DI를 적용하기 위해 포함되었고, 단지 여러분의 ViewModel 생성자를 적용해도 무방합니다. 

이후 CategoryDialogViewModel과 같은 BottomSheetDialog에 적용할 ViewModel을 작성하고 dialog_category.xml을 정의합니다.(물론 Databinding을 적용하기 위해 <layout><data><variable>...</variable></data></layout>로 작성되야겠죠 ??)

이후 Dialog를 출력하기 위한 View에서 다음과 같이 코드를 작성합니다.

fun showCategoryDialog(){
        val bottomDialogFragment = BottomSheetDialogFragment(viewModelFactory)
        bottomDialogFragment.show(supportFragmentManager, bottomDialogFragment.tag)
}

이렇게 작성이 완료되면 Dialog는 정의한 ViewModel과 바인딩됩니다. 그리고 dialog의 상위 뷰에서 showCategoryDialog() 함수를 호출하면 다이얼로그가 출력됩니다.

 

이후 Dialog의 행위에 대한 동작은 여러분의 ViewModel에서 정의하면 됩니다.(확인, 취소 버튼과 같이 기본 Dialog에 대한 정의도 이루어져야 사용자 경험에 좋을 것입니다)

 

이것으로 'BottomSheetDialog에 MVVM을 적용하기' 포스팅을 마치도록 하겠습니다.

 

전체 코드 또는 궁금하신점이 있다면 댓글 남겨주시면 감사하겠습니다.(Databinding, MVVM 기본에 대해서는 알고 계신다고 가정하고 ViewModel, Layout의 코드는 제외하였습니다)