4

我正在尝试添加一个

fragmentTransaction.hide(myDialogFragment);
fragmentTransaction.addToBackStack(null);

FragmentTransaction以便当用户点击后退按钮时对话框将重新出现,但它不起作用。我最初在 DialogFragment 中覆盖了 onCreateDialog,但我注意到有关 FragmentTransaction 的隐藏调用的文档指出:

这仅与视图已添加到容器中的片段相关。

因此,现在我将覆盖 onCreateView。现在它有点隐藏,但不是真的。对话框只是缩小了,但窗口仍然是黑暗的。我必须点击后退按钮才能摆脱它,这显然不是我想要的行为。我在这里想念什么?

4

3 回答 3

9

ADialogFragment在内部维护一个对话框,并根据自己的生命周期在其上调用 show 和 hide 方法。调用FragmentTransaction.hide()只是试图将片段视图的可见性设置Fragment.onCreateView()为 View.GONE。DialogFragment 的视图恰好是用于其内部对话框的视图,因此您所做的就是隐藏对话框上的内容。不幸的是,隐藏视图并不会“关闭”对话框,因此屏幕仍然会变暗。

当您调用时DialogFragment.show(FragmentTransaction,String)FragmentTransaction会创建 a 以将其添加到FragmentManager. 通常,显示对话框被认为是“活动”事务,然后将其关闭只是将返回堆栈弹出适当的次数。如果您没有在其间添加任何其他片段,则使用删除操作创建一个新的 FragmentTransaction。如果我们可以访问它,那么我们可以添加一个 backstack 条目并使这个操作可逆。不幸的是,这是不可能的,所以我们能做的最好的就是制作我们自己的解除方法(并希望内部状态不会变得太糟):

public class UndoDialogFragmentActivity extends FragmentActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // show a dialog fragment in the normal way
                new MyDialogFragment().show(getSupportFragmentManager(), "dialog");
            }
        });
    }

    private static class MyDialogFragment extends DialogFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setStyle(STYLE_NO_TITLE, getTheme());
            // do not allow back button to dismiss dialog; confusing behaviour otherwise!
            setCancelable(false);
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            Button button = new Button(getActivity());
            button.setText("Dismiss");
            button.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    // pressing back after 'dismissing' the dialog will cause it to be added again
                    getFragmentManager().beginTransaction().remove(MyDialogFragment.this).addToBackStack(null).commit();
                }
            });

            return button;
        }
    }
}

单击片段中的按钮将导致 DialogFragment 打开,并带有自己的关闭按钮。按下关闭后,您可以通过按返回键再次显示对话框,撤消删除操作。当您允许后退键显示和隐藏对话框时,这会产生一些可疑的行为,但细节可以由您根据您的应用程序决定。

于 2012-03-16T22:28:05.010 回答
4

getDialog().hide()我可以通过从我的 DialogFragment 中调用来隐藏 DialogFragment 的对话框。

于 2012-09-18T22:07:47.963 回答
1

如果您正在使用API Level 11或更高版本,您可以简单地dismiss()DialogFragment自身FragmentActivity或从DialogFragment自身调用 。

于 2013-09-04T13:12:16.193 回答