DialogFragment로 대화상자 표시

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() 메서드를 사용하여 대화상자를 표시할 수 있습니다. 또한 FragmentManagerString에 관한 참조를 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)를 직접 호출하는 대신 이 메서드를 사용하세요.

DialogFragmentDialog와 함께 사용할 때는 onCreateView() 또는 onViewCreated()를 재정의하지 않습니다. 대화상자는 보기일 뿐만 아니라 자체 창이 있습니다. 따라서 onCreateView()를 재정의하는 것만으로는 충분하지 않습니다. 게다가 onCreateView()를 재정의하고 null이 아닌 뷰를 제공하지 않는 한, 맞춤 DialogFragment에서 onViewCreated()가 호출되지 않습니다.

맞춤 뷰 사용

DialogFragment를 만들고 onCreateView()를 재정의하여 대화상자를 표시할 수 있습니다. 일반적인 프래그먼트와 마찬가지로 layoutId를 제공하거나 DialogFragment 생성자를 사용할 수 있습니다.

onCreateView()에서 반환된 View가 대화상자에 자동으로 추가됩니다. 즉, 비어 있는 기본 대화상자가 뷰로 채워지므로 대부분의 경우 onCreateDialog()를 재정의할 필요가 없습니다.

DialogFragment의 특정 서브클래스(예: BottomSheetDialogFragment)는 하단 시트로 스타일이 지정된 대화상자에 뷰를 삽입합니다.