DialogFragment y onDismiss

Estoy usando un DialogFragment , que estoy mostrando así de una Activity :

 DialogFragmentImage dialog = DialogFragmentImage.newInstance(createBitmap()); dialog.onDismiss(dialog);.onDismiss(this); dialog.show(getFragmentManager(), "DialogFragmentImage"); 

Me gustaría comprobar cuándo se DialogFragment (por ejemplo, cuando se presionó el botón Atrás), pero en mi Activity . ¿Cómo puedo hacer eso? ¿Cómo puedo “decirle” a mi activity que el DialogFragmen t ha sido descartado?

Haga que su actividad implemente OnDismissListener

 public final class YourActivity extends Activity implements DialogInterface.OnDismissListener { @Override public void onDismiss(final DialogInterface dialog) { //Fragment dialog had been dismissed } } 

DialogFragment ya implementa OnDismissListener , simplemente anule el método y llame a la Actividad.

 public final class DialogFragmentImage extends DialogFragment { ///blah blah @Override public void onDismiss(final DialogInterface dialog) { super.onDismiss(dialog); final Activity activity = getActivity(); if (activity instanceof DialogInterface.OnDismissListener) { ((DialogInterface.OnDismissListener) activity).onDismiss(dialog); } } } 

Si está iniciando el diálogo desde un fragmento utilizando childFragment manager (API> = 17), puede usar getParentFragment para hablar con el onDismissListener en el fragmento principal .:

 public final class DialogFragmentImage extends DialogFragment { ///blah blah @Override public void onDismiss(final DialogInterface dialog) { super.onDismiss(dialog); Fragment parentFragment = getParentFragment(); if (parentFragment instanceof DialogInterface.OnDismissListener) { ((DialogInterface.OnDismissListener) parentFragment).onDismiss(dialog); } } } 

Aquí está mi respuesta. Es un poco tarde, pero tal vez beneficie a alguien que pasa.

 FragmentManager fm = getFragmentManager(); YourDialogFragment dialog = new YourDialogFragment(); dialog.show(fm,"MyDialog"); fm.executePendingTransactions(); dialog.getDialog().setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialogInterface) { //do whatever you want when dialog is dismissed } }); 

Necesitamos llamar

 fm.executePendingTransactions(); 

Para asegurarse de que se haya realizado el trabajo FragmentTransaction. De lo contrario, NullPointerException puede ocurrir al llamar a setOnDismissListener() .

Perdón si hay algún error. Espero que esto ayude.

Respuesta alternativa, si no tiene acceso al método en Descarte de actividad.

 //DIALOGFRAGMENT //Create interface in your DialogFragment (or a new file) public interface OnDismissListener { void onDismiss(MyDialogFragment myDialogFragment); } //create Pointer and setter to it private OnDismissListener onDismissListener; public void setDissmissListener(DissmissListener dissmissListener) { this.dissmissListener = dissmissListener; } //Call it on the dialogFragment onDissmiss @Override public void onDismiss(DialogInterface dialog) { super.onDismiss(dialog); if (onDismissListener != null) { onDismissListener.onDismiss(this); } } //OTHER CLASS, start fragment where you want MyDialogFragment df = new MyDialogFragment(); df.setOnDismissListener(new MyDialogFragment.OnDismissListener() { @Override public void onDismiss(MyDialogFragment myDialogFragment) { //Call when MyDialogFragment close } }); df.show(activity.getFragmentManager(), "myDialogFragment"); 

editar: si el sistema necesita recrear DialogFragment: puede encontrarlo con

 MyDialogFragment myDialogFragment = getFragmentManager().findFragmentByTag("MyDialogFragment"); if(myDialogFragment != null) { myDialogFragment.setOnDismissListener(...); } 

Este es un problema antiguo, pero no encontré ninguna solución con la que estoy contento. No me gusta pasar ningún Oyente a mi DialogFragment ni establecer un TargetFragment, porque puede romper el cambio de orientación. ¿Qué piensas sobre esto?

  MyDialog d = new MyDialog(); d.show(fragmentManager, "tag"); fragmentManager.registerFragmentLifecycleCallbacks(new FragmentManager.FragmentLifecycleCallbacks() { @Override public void onFragmentViewDestroyed(FragmentManager fm, Fragment f) { super.onFragmentViewDestroyed(fm, f); //do sth fragmentManager.unregisterFragmentLifecycleCallbacks(this); } }, false); 
 public class OpcoesProdutoDialogo extends DialogFragment{ private DialogInterface.OnDismissListener onDismissOuvinte; . . . @Override public void onDismiss(DialogInterface dialog) { super.onDismiss(dialog); if(onDismissOuvinte!=null) onDismissOuvinte.onDismiss(dialog); } public void setOnDismissListener(@Nullable DialogInterface.OnDismissListener listener) { this.onDismissOuvinte = listener; } } 

y en llamada

 OpcoesProdutoDialogo opcProduto = OpcoesProdutoDialogo.criar(itemPedido); opcProduto.show(getFragmentManager(), "opc_produto_editar"); opcProduto.setOnDismissListener(d->{ adapterItens.notifyItemChanged(posicao); }); 

Puede subclase DialogFragment y proporcionar su propio oyente al que se va a llamar y en onCancel.

 var onDismissListener: (() -> Unit)? = null 

Para los que no están familiarizados con Kotlin, esta es solo una interfaz anónima que guarda la interfaz en Java. Usa un campo y un setter en Java.

Y luego en onCancelar

  override fun onCancel(dialog: DialogInterface?) { super.onCancel(dialog) onDismissListener?.invoke() } 

¡Que te diviertas!