DialogFragment и onDismiss

Я использую DialogFragment , который я показываю так из Activity :

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

Я хотел бы проверить, когда DialogFragment был уволен (например, когда была нажата кнопка «Назад»), но в моей Activity . Как я могу это сделать? Как я могу «рассказать» о своей activity что DialogFragmen t был уволен?

Solutions Collecting From Web of "DialogFragment и onDismiss"

Сделайте свою деятельность реализацией OnDismissListener

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

DialogFragment уже реализует OnDismissListener , просто переопределяет метод и вызывает Activity.

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

Если вы запускаете диалог из фрагмента с помощью менеджера childFragment (API> = 17), вы можете использовать getParentFragment для общения с onDismissListener на родительском фрагменте:

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

Вот мой ответ. Это немного поздно, но, возможно, это поможет кому-то пройти мимо.

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

Нам нужно позвонить

 fm.executePendingTransactions(); 

Чтобы убедиться, что работа FragmentTransaction выполнена. В противном случае при вызове setOnDismissListener() может возникнуть setOnDismissListener() .

Извините, если есть какая-либо ошибка. Надеюсь, эта помощь.

Альтернативный ответ, если у вас нет доступа к методу onDismiss активности.

 //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: если система должна воссоздать DialogFragment: вы можете найти ее с помощью

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

Это старая проблема, но я не нашел решения, которым я доволен. Мне не нравится передавать никаких прослушивателей в мой диалог или устанавливать TargetFragment, потому что это может нарушить изменение ориентации. Что Вы думаете об этом?

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