Dialogue fragment et onDismiss

j'utilise un DialogFragment, que je montre comme ceci d'un Activity:

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

je voudrais vérifier quand le DialogFragment a été rejeté (par exemple lorsque le dos bouton a été pressé), mais dans mon Activity. Comment puis-je le faire? Comment puis-je "dis" mon activityDialogFragment a été rejeté?

39
demandé sur mmBs 2014-05-21 18:22:38

6 réponses

faites en sorte que votre activité soit mise en oeuvre OnDismissListener

public final class YourActivity extends Activity implements DialogInterface.OnDismissListener {

    @Override
    public void onDismiss(final DialogInterface dialog) {
        //Fragment dialog had been dismissed
    }

}

DialogFragment implémente déjà OnDismissListener, il suffit d'annuler la méthode et d'appeler L'activité.

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 vous démarrez la boîte de dialogue à partir d'un fragment en utilisant le childFragment gestionnaire de l'API (>=17), vous pouvez utiliser getParentFragment pour parler au onDismissListener sur le fragment parent.:

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

}
73
répondu Yaroslav Mytkalyk 2015-11-26 16:09:44

Voici ma réponse. C'est un peu tard, mais ça profite peut-être à quelqu'un qui passe.

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

nous devons appeler

fm.executePendingTransactions(); 

pour s'assurer que le travail de FragmentTransaction a été effectué. Sinon,NullPointerException peut se produire lors de l'appel de setOnDismissListener().

Désolé s'il y a une erreur. Espérons que cette aide.

11
répondu Boonya Kitpitak 2017-02-06 10:44:07

réponse Alternative, si vous n'avez pas accès à la méthode onDismiss de l'activité.

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

edit : si le système doit recréer DialogFragment: vous pouvez le trouver avec

MyDialogFragment myDialogFragment = getFragmentManager().findFragmentByTag("MyDialogFragment"); 
if(myDialogFragment != null) { 
   myDialogFragment.setOnDismissListener(...); 
}
4
répondu Anthone 2015-11-27 10:18:42

C'est un vieux problème mais je n'ai trouvé aucune solution qui me satisfasse. Je n'aime pas transmettre des écouteurs à mon DialogFragment ou définir un TargetFragment, parce que cela peut casser sur le changement d'orientation. Que pensez-vous de cela?

        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);
3
répondu Kaskasi 2017-05-17 15:00:33
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;
    }
}

et en appeler

OpcoesProdutoDialogo opcProduto = OpcoesProdutoDialogo.criar(itemPedido);
        opcProduto.show(getFragmentManager(), "opc_produto_editar");
        opcProduto.setOnDismissListener(d->{
            adapterItens.notifyItemChanged(posicao);
        });
1
répondu user3795295 2018-08-23 15:15:46

vous pouvez sous-classe DialogFragment et fournir votre propre auditeur qui va être appelé et en onCancel.

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

pour ceux qui ne sont pas familiers avec Kotlin, il s'agit simplement d'une interface anonyme qui sauvegarde boilerplate iterface en Java. Utilisez un champ et un setter en Java.

puis, dans onCancel

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

amusez-vous!

0
répondu Preslav Petkov 2018-05-16 15:29:04