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 umDialog
para o fragmento gerenciar e exibir.onDismiss()
: substitua esse callback se precisar executar qualquer lógica personalizada ao oDialog
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 seuDialog
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 oDialog
mostrado 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.