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 umDialogpara o fragmento gerenciar e exibir.onDismiss(): substitua esse callback se precisar executar qualquer lógica personalizada ao oDialogfoi 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 seuDialogfoi 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 oDialogmostrado pode ser cancelado. Usar este método em vez de chamar diretamenteDialog.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.