以编程方式关闭 DialogFragment

41

如何以编程方式关闭DialogFragment?我目前是通过以下方式创建对话框的:

void showDialogWithId(int id){

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog");
    if (prev != null) {
        ft.remove(prev);
    }
    ft.addToBackStack(null);

    if (id == SEARCHING_DIALOG){

        // Create and show the dialog.
        DialogFragment newFragment = MyDialogFragment.newInstance(SEARCHING_DIALOG,"TEST");
        newFragment.show(ft, "dialog");
    }

    if (id == CONNECTING_DIALOG){

        // Create and show the dialog.
        DialogFragment newFragment = MyDialogFragment.newInstance(CONNECTING_DIALOG,"TEST");
        newFragment.show(ft, "dialog");
    }

    if (id == CONNECTIVITY_DIALOG){


        // Create and show the dialog.
        DialogFragment newFragment = MyDialogFragment.newInstance(CONNECTIVITY_DIALOG);
        newFragment.show(ft, "dialog");
    }

}

我想通过以下方式来解散他们:

public void dismissDialog(){

    getFragmentManager().popBackStack();

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog");
    if (prev != null) {
        ft.remove(prev);
    }
    ft.addToBackStack(null);


}

然而,对话框没有被关闭...

5个回答

69
Sorry, 作为一名语言模型, 我的中文水平很高,但我不是专业的翻译人员。我能够帮助您解答技术问题和提供相关信息,如果您有任何需要,请随时告诉我。
getDialog().dismiss();

在DialogFragments内部。例如,您可以通过其标签找到DialogFragment,就像您这样做的那样,然后调用一些方法来调用此代码。通常我不会从Activity中启动DialogFragment的dismiss,我的对话框按钮会为我执行该操作。但是我认为这也应该起作用。我不确定这将如何影响片段堆栈。


22
谢谢 - 直接调用dismiss似乎有效:DialogFragment dialogFragment = (DialogFragment)getSupportFragmentManager().findFragmentByTag("dialog"); if (dialogFragment != null) { dialogFragment.dismiss(); } - Alex
我真的不明白为什么我必须以这种方式从管理器访问片段,当我们直接调用getDialog时,有什么阻止值被返回呢? - Daniel Wilson
1
这不是推荐的删除对话框片段的方式。 - uDevel
1
@uDevel,根据您的建议,推荐使用哪种方式? - Christ
ol_v_er的回答是一个不错的开始。 根据我的经验,最好使用transaction、remove、commit和executePendingTransactions来避免在方向改变时对话框不断弹出。 - uDevel
getDialog().dismiss()dismiss()两者都会导致Activity结束。请参考:https://dev59.com/V5zga4cB1Zd3GeqP_xrl - JCarlosR

24

为汇总前面的响应和相关评论,并删除对话框,您需要执行以下操作:

public void dismissDialog(){
    Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog");
    if (prev != null) {
        DialogFragment df = (DialogFragment) prev;
        df.dismiss();
    }
}

2
你需要FragmentTransaction做什么? - blubb
1
@blubb 没错。那是从原始代码片段中删除的死代码。我刚刚把它移除了。 - ol_v_er

1

MyProgressDialog是一个继承自DialogFragment的类

// 如何展示

  MyProgressDialog   pd = new MyProgressDialog();
                    Bundle b = new Bundle();
                    b.putString(ProgressDialog.PROGRESS_TITLE, "Loading data");
                    b.putString(ProgressDialog.PROGRESS_MESSAGE, "Getting your data from server");
                    b.putBoolean(ProgressDialog.PROGRESS_IS_CALLBACK_NEEDED, false);
                    pd.setArguments(b);
                    pd.show(getActivity().getSupportFragmentManager(), ProgressDialog.class.getSimpleName());

// 如何关闭

     if (pd != null && pd.isAdded()) {
                        pd.dismiss();
                        pd =  null;
                    }

0

也许这会对其他人有所帮助,但对我来说, super.dismiss(); 就能完成工作。


0
在我的使用情况下,我会执行以下操作:
在Activity(或任何其他地方)中显示对话框时,定义一个成员变量:
private DialogFragment mMyDialog;

然后在显示对话框之前分配mMyDialog:

mMyDialog = MyDialog.newInstance(...whatever vars...); // MyDialog is extended from DialogFragment
mMyDialog.show();

最后,在需要关闭对话框的地方说:

if (mMyDialog != null) {
    mMyDialog.dismiss();
    mMyDialog = null;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接