관리 메뉴

Kyung_Development

Android에서 DialogFragment를 사용하는 이유와 방법 본문

android

Android에서 DialogFragment를 사용하는 이유와 방법

Kyung_Development 2025. 2. 18. 15:58

안드로이드에서 다이얼로그를 띄우는 방법은 여러 가지가 있지만, DialogFragment는 가장 유연하고 강력한 옵션 중 하나입니다. 이번 포스팅에서는 Fragment, DialogFragment, BottomSheetDialogFragment의 차이점과 DialogFragment를 사용하는 이유를 정리해보겠습니다.


1. Fragment, DialogFragment, BottomSheetDialogFragment의 차이점

1) Fragment

  • 역할: 액티비티 내에서 UI를 재사용할 수 있도록 돕는 독립적인 UI 컴포넌트
  • 특징:
    • 여러 개의 프래그먼트를 하나의 액티비티에서 활용 가능
    • ViewPager 또는 Navigation Component에서 활용됨
    • Activity의 생명주기에 종속됨
  • 사용 예시:
    class MyFragment : Fragment(R.layout.fragment_my) {
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            // UI 설정 및 이벤트 처리
        }
    }
    

2) DialogFragment

  • 역할: 팝업 형태의 다이얼로그를 생성하는 Fragment
  • 특징:
    • 일반적인 AlertDialog보다 유연한 UI 구성이 가능
    • 회전 시에도 다이얼로그 유지
    • show() 메서드를 통해 다이얼로그 표시
  • 사용 예시:
    class MyDialogFragment : DialogFragment() {
        override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
            return AlertDialog.Builder(requireContext())
                .setTitle("Title")
                .setMessage("This is a dialog fragment.")
                .setPositiveButton("OK") { _, _ -> }
                .create()
        }
    }
    
    // 다이얼로그 띄우기
    val dialog = MyDialogFragment()
    dialog.show(supportFragmentManager, "MyDialog")
    

3) BottomSheetDialogFragment

  • 역할: 화면 하단에서 올라오는 BottomSheet 형태의 DialogFragment
  • 특징:
    • 머티리얼 디자인 기반의 Bottom Sheet 스타일 적용
    • 사용자가 위로 스와이프하여 닫을 수 있음
    • BottomSheetDialogFragment를 상속하여 구현
  • 사용 예시:
    class MyBottomSheetFragment : BottomSheetDialogFragment() {
        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View {
            return inflater.inflate(R.layout.fragment_bottom_sheet, container, false)
        }
    }
    
    // 바텀시트 띄우기
    val bottomSheet = MyBottomSheetFragment()
    bottomSheet.show(supportFragmentManager, "MyBottomSheet")
    

2. 왜 Dialog 대신 DialogFragment를 사용할까?

1) 화면 회전 시 자동 복원

기본 Dialog는 화면이 회전하면 사라지지만, DialogFragment는 FragmentManager를 통해 자동으로 복원됩니다.

val dialog = MyDialogFragment()
dialog.show(supportFragmentManager, "MyDialog")
  • 화면이 회전해도 MyDialogFragment가 유지됨.

2) 액티비티 생명주기와 동기화

  • DialogFragment는 Activity와 같은 생명주기를 따르므로 메모리 누수를 방지할 수 있음.
  • onPause() 시 자동으로 닫히고, onResume() 시 복원됨.

3) 백 스택 관리 가능

  • DialogFragment는 FragmentTransaction을 사용하여 백 스택에 추가할 수 있음.
  • 뒤로 가기 버튼을 눌렀을 때 다이얼로그를 닫을 수 있음.
val dialog = MyDialogFragment()
dialog.show(supportFragmentManager, "MyDialog")

4) 커스텀 UI 구성 용이

  • DialogFragment는 XML 레이아웃을 활용하여 복잡한 UI를 구성할 수 있음.
class MyDialogFragment : DialogFragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        return inflater.inflate(R.layout.fragment_dialog, container, false)
    }
}

3. Dialog vs. DialogFragment 비교

구분 Dialog DialogFragment

라이프사이클 액티비티의 라이프사이클을 직접 관리해야 함 FragmentManager를 통해 자동 관리
회전 처리 화면 회전 시 Dialog가 사라짐 (수동으로 관리 필요) 회전해도 자동으로 상태 복원됨
백 스택 관리 직접 구현해야 함 FragmentTransaction을 사용하여 자동으로 처리됨
UI 확장성 AlertDialog 커스텀 뷰 사용 가능하지만 제한적 XML 레이아웃을 활용해 자유롭게 UI 구성 가능
재사용성 독립적으로 재사용 어려움 여러 액티비티에서 사용 가능

4. DialogFragment를 사용해야 하는 경우

사용 추천

  • 화면 회전 시 다이얼로그가 유지되어야 할 때
  • FragmentManager를 활용한 다이얼로그 관리가 필요할 때
  • 백 스택에 추가하고 싶은 경우
  • 복잡한 커스텀 UI를 사용하고 싶을 때

일반 Dialog를 써도 되는 경우

  • 간단한 AlertDialog(예: 확인, 취소 버튼만 있는 다이얼로그)
  • 화면 회전이 고려되지 않는 경우

결론

복잡한 다이얼로그 UI + 액티비티 생명주기와 동기화 → DialogFragment
간단한 메시지 팝업만 필요 → Dialog

DialogFragment는 유지보수성과 확장성이 뛰어나므로, 다이얼로그를 사용할 때 고려해보는 것이 좋습니다! 😊

'android' 카테고리의 다른 글

소프트웨어 개발 구성 요소 및 개념들 쉽게 이해하기  (0) 2025.02.13
Firebase Event  (0) 2025.01.17