DialogFragment和onDismiss

dei*_*988 54 android android-dialogfragment

我正在使用一个DialogFragment,我从这样一个显示Activity:

DialogFragmentImage dialog = DialogFragmentImage.newInstance(createBitmap());
dialog.onDismiss(dialog);.onDismiss(this);          
dialog.show(getFragmentManager(), "DialogFragmentImage");
Run Code Online (Sandbox Code Playgroud)

我想检查何时DialogFragment被解雇(例如当按下后退按钮时),但在我的Activity.我怎样才能做到这一点?我怎么能"告诉"我activityDialogFragment已被解雇?

Yar*_*lyk 89

让您的活动实施 OnDismissListener

public final class YourActivity extends Activity implements DialogInterface.OnDismissListener {

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

}
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

如果您使用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);
        } 
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 你不能将dismiss listener设置为`DialogFragment`所拥有的对话框,Doctoror Drive提供的解决方案是正确的.只是不要忘记调用`super.onDismiss(对话框)` - 否则会被破坏. (8认同)

Boo*_*tak 20

这是我的答案.这有点晚了,但也许有人会路过.

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
                    }
                });
Run Code Online (Sandbox Code Playgroud)

我们需要打电话

fm.executePendingTransactions(); 
Run Code Online (Sandbox Code Playgroud)

确保已执行FragmentTransaction工作.否则NullPointerException可以在通话时发生setOnDismissListener().

对不起,如果有任何错误.希望这有帮助.

  • 似乎是干净的解决方案,但是在屏幕旋转时,它会调用`onDismiss`回调,这可能触发不需要的逻辑,假设当用户在对话框中做出一些动作之后应该运行这个逻辑,之后调用`dismiss()` (2认同)
  • 官方文档指出,与其先调用“show()”然后调用“executePendingTransactions()”,不如直接调用惯用的“showNow()”会更简洁。 (2认同)

Kas*_*asi 8

这是一个老问题,但是我找不到满意的解决方案。我不喜欢将任何侦听器传递给我的DialogFragment或设置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);
Run Code Online (Sandbox Code Playgroud)


Ant*_*one 6

替代答案,如果您无权访问 onDismiss of 活动的方法。

//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");
Run Code Online (Sandbox Code Playgroud)

编辑:如果系统需要重新创建DialogFragment:你可以找到它

MyDialogFragment myDialogFragment = getFragmentManager().findFragmentByTag("MyDialogFragment"); 
if(myDialogFragment != null) { 
   myDialogFragment.setOnDismissListener(...); 
}
Run Code Online (Sandbox Code Playgroud)