DialogFragment
는 대화상자를 만들고 호스팅하도록 설계된 특수 프래그먼트 서브클래스입니다. 프래그먼트 내에서 대화상자를 호스팅할 필요는 없지만, 이렇게 하면 FragmentManager
가 대화상자의 상태를 관리하고 구성 변경이 발생할 때 자동으로 대화상자를 복원할 수 있습니다.
DialogFragment 만들기
DialogFragment
를 만들려면 다음 예와 같이 DialogFragment
를 확장하고 onCreateDialog()
를 재정의하는 클래스를 만듭니다.
Kotlin
class PurchaseConfirmationDialogFragment : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = AlertDialog.Builder(requireContext()) .setMessage(getString(R.string.order_confirmation)) .setPositiveButton(getString(R.string.ok)) { _,_ -> } .create() companion object { const val TAG = "PurchaseConfirmationDialog" } }
Java
public class PurchaseConfirmationDialogFragment extends DialogFragment { @NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { return new AlertDialog.Builder(requireContext()) .setMessage(getString(R.string.order_confirmation)) .setPositiveButton(getString(R.string.ok), (dialog, which) -> {} ) .create(); } public static String TAG = "PurchaseConfirmationDialog"; }
onCreateView()
가 일반 프래그먼트에서 루트 View
를 만드는 방법과 마찬가지로 onCreateDialog()
는 DialogFragment
의 일부로 표시할 Dialog
를 만듭니다. DialogFragment
는 프래그먼트의 수명 주기에서 적절한 상태로 Dialog
를 표시하도록 처리합니다.
onCreateView()
와 마찬가지로 onCreateDialog()
에서 Dialog
의 서브클래스를 반환할 수 있으며 AlertDialog
를 사용하도록 제한되지 않습니다.
DialogFragment 표시
DialogFragment
를 표시하기 위해 FragmentTransaction
를 수동으로 만들 필요가 없습니다. 대신 show()
메서드를 사용하여 대화상자를 표시할 수 있습니다. 또한 FragmentManager
및 String
에 관한 참조를 FragmentTransaction
태그로 사용하도록 전달할 수 있습니다.
Fragment
내에서 DialogFragment
를 만들 때는 구성 변경 후에 상태가 올바르게 복원되도록 프래그먼트의 하위 FragmentManager
를 사용합니다. null이 아닌 태그를 사용하면 나중에 findFragmentByTag()
를 사용하여 DialogFragment
를 검색할 수 있습니다.
Kotlin
// From another Fragment or Activity where you wish to show this // PurchaseConfirmationDialogFragment. PurchaseConfirmationDialogFragment().show( childFragmentManager, PurchaseConfirmationDialog.TAG)
Java
// From another Fragment or Activity where you wish to show this // PurchaseConfirmationDialogFragment. new PurchaseConfirmationDialogFragment().show( getChildFragmentManager(), PurchaseConfirmationDialog.TAG);
FragmentTransaction
을 더 세부적으로 제어하려면 기존 FragmentTransaction
을 허용하는 show()
오버로드를 사용하면 됩니다.
DialogFragment 수명 주기
DialogFragment
는 몇 가지 추가 수명 주기 콜백과 함께 표준 프래그먼트 수명 주기를 따릅니다. 가장 일반적인 콜백은 다음과 같습니다.
onCreateDialog()
: 이 콜백을 재정의하여 프래그먼트가 관리하고 표시할Dialog
를 제공합니다.onDismiss()
:Dialog
가 닫힐 때 맞춤 로직을 실행해야 하는 경우(예: 리소스를 해제하거나 관찰 가능한 리소스에서 구독을 취소하는 등) 이 콜백을 재정의합니다.onCancel()
:Dialog
가 취소되었을 때 맞춤 로직을 실행해야 하는 경우 이 콜백을 재정의합니다.
DialogFragment
에는 DialogFragment
의 취소 가능 여부를 닫거나 설정하는 메서드도 포함되어 있습니다.
dismiss()
: 프래그먼트와 관련 대화상자를 닫습니다. 프래그먼트가 백 스택에 추가된 경우 이 항목까지의 모든 백 스택 상태가 표시됩니다. 그 외의 경우에는 프래그먼트 삭제를 위해 새 트랜잭션이 커밋됩니다.setCancelable()
: 표시된Dialog
를 취소할 수 있는지 제어합니다.Dialog.setCancelable(boolean)
를 직접 호출하는 대신 이 메서드를 사용하세요.
DialogFragment
를 Dialog
와 함께 사용할 때는 onCreateView()
또는 onViewCreated()
를 재정의하지 않습니다. 대화상자는 보기일 뿐만 아니라 자체 창이 있습니다. 따라서 onCreateView()
를 재정의하는 것만으로는 충분하지 않습니다. 게다가 onCreateView()
를 재정의하고 null이 아닌 뷰를 제공하지 않는 한, 맞춤 DialogFragment
에서 onViewCreated()
가 호출되지 않습니다.
맞춤 뷰 사용
DialogFragment
를 만들고 onCreateView()
를 재정의하여 대화상자를 표시할 수 있습니다.
일반적인 프래그먼트와 마찬가지로 layoutId
를 제공하거나 DialogFragment
생성자를 사용할 수 있습니다.
onCreateView()
에서 반환된 View
가 대화상자에 자동으로 추가됩니다. 즉, 비어 있는 기본 대화상자가 뷰로 채워지므로 대부분의 경우 onCreateDialog()
를 재정의할 필요가 없습니다.
DialogFragment
의 특정 서브클래스(예: BottomSheetDialogFragment
)는 하단 시트로 스타일이 지정된 대화상자에 뷰를 삽입합니다.