Mostrar caixas de diálogo com um DialogFragment

Um DialogFragment é uma subclasse de fragmento especial projetada para criar e hospedar caixas de diálogo. Embora você não precise hospedar sua caixa de diálogo em um fragmento, ao fazer isso permite que o FragmentManager gerenciam o estado. da caixa de diálogo e restaurá-la automaticamente quando uma configuração a mudança ocorrer.

Criar um DialogFragment

Para criar um DialogFragment, crie uma classe que estenda DialogFragment e sobrepor-se onCreateDialog(), como mostrado no exemplo a seguir.

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";
}

Semelhante a como onCreateView() cria um View raiz em um fragmento comum onCreateDialog() cria uma Dialog para mostrar como parte de DialogFragment. O DialogFragment processa a exibição da Dialog nos estados apropriados no ciclo de vida do fragmento.

Assim como acontece com onCreateView(), é possível retornar qualquer subclasse de Dialog. a partir de onCreateDialog() e não se limitam ao uso AlertDialog

Mostrar o DialogFragment

Não é necessário criar um FragmentTransaction manualmente para exibir o DialogFragment. Em vez disso, use o método show() para exibir a caixa de diálogo. Você pode transmitir uma referência a um FragmentManager e uma String para usar como tag de FragmentTransaction.

Ao criar um DialogFragment de dentro de uma Fragment, use o FragmentManager filho para que o estado seja restaurado corretamente após as mudanças na configuração. Uma tag não nula permite usar findFragmentByTag() para extrair o DialogFragment mais tarde.

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);

Para ter mais controle sobre a FragmentTransaction, é possível usar a sobrecarga show(), que aceita uma FragmentTransaction.

Ciclo de vida do DialogFragment

Um DialogFragment segue o ciclo de vida padrão do fragmento, com alguns callbacks do ciclo de vida. Os mais comuns são os seguintes:

  • onCreateDialog(): substitua esse callback para fornecer um Dialog para o fragmento gerenciar e exibir.
  • onDismiss(): substitua esse callback se precisar executar qualquer lógica personalizada ao o Dialog foi dispensado, por exemplo, liberando recursos ou cancelando a inscrição de recursos observáveis.
  • onCancel(): substitua esse retorno de chamada se precisar executar qualquer lógica personalizada quando seu Dialog foi cancelado.

DialogFragment também contém métodos para dispensar ou definir a possibilidade de cancelamento dos seus DialogFragment:

  • dismiss(): dispensar o fragmento e a caixa de diálogo dele. Se o fragmento tiver sido adicionado ao todo o estado da backstack até a entrada, inclusive esta, são exibidos. Caso contrário, uma nova transação será confirmada para remover o fragmento.
  • setCancelable(): controla se o Dialog mostrado pode ser cancelado. Usar este método em vez de chamar diretamente Dialog.setCancelable(boolean)

Você não substitui onCreateView() ou onViewCreated() ao usar um DialogFragment com um Dialog. As caixas de diálogo não são apenas vistas, porque elas têm uma janela própria. Por isso, não basta substituir onCreateView(): Além disso, onViewCreated() nunca é chamado em um DialogFragment personalizado, a menos que você tenha substituído onCreateView() e fornecido uma visualização não nula.

Usar visualizações personalizadas

É possível criar um DialogFragment e exibir uma caixa de diálogo modificando onCreateView(). É possível atribuir um layoutId, como em um fragmento comum, ou usar o construtor DialogFragment.

O valor de View retornado por onCreateView() é adicionado automaticamente à caixa de diálogo. Na maioria dos casos, isso significa que você não precisa substituir onCreateDialog(), já que a caixa de diálogo vazia padrão é preenchida com a visualização.

Algumas subclasses do DialogFragment, como BottomSheetDialogFragment, incorporam a visualização em uma caixa de diálogo com estilo semelhante ao de uma página inferior.