android - full - DialogFragment y onDismiss
launch dialogfragment (6)
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.
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?
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);
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);
}
}
}
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!
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(...);
}
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);
});