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 activity
DialogFragmen
t a été rejeté?
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);
}
}
}
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.
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(...);
}
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);
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);
});
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!