Android:FragmentTransaction隐藏不';我不能为DialogFragment工作

Android:FragmentTransaction隐藏不';我不能为DialogFragment工作,android,android-fragments,android-dialogfragment,Android,Android Fragments,Android Dialogfragment,我正试图添加一个 fragmentTransaction.hide(myDialogFragment); fragmentTransaction.addToBackStack(null); 以使对话框在用户单击“后退”按钮时重新显示,但该按钮不起作用。我最初在DialogFragment中重写了onCreateDialog,但我注意到调用FragmentTransaction的文档说明: 这仅适用于视图已添加到 容器 因此,现在我将覆盖onCreateView。现在它有点隐藏,但不是真的。对话

我正试图添加一个

fragmentTransaction.hide(myDialogFragment);
fragmentTransaction.addToBackStack(null);
以使对话框在用户单击“后退”按钮时重新显示,但该按钮不起作用。我最初在DialogFragment中重写了onCreateDialog,但我注意到调用FragmentTransaction的文档说明:

这仅适用于视图已添加到 容器


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

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

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


单击片段中的按钮将打开一个DialogFragment,它有自己的Disclose按钮。按Disclose后,可以通过按back键重新显示对话框,取消删除操作。当您允许back键同时显示和隐藏对话框时,这会产生一些可疑的行为,但详细信息可以由您根据应用程序决定。

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

如果您使用的是
API 11级
或更高级别,您只需在
DialogFragment
上调用
dismise()
,或者从
FragmentActivity
或者从
DialogFragment
本身调用。

我有一个奇妙的问题(返回-/new fragment)通过在我的代码中注释beginTransaction().remove解决了这个问题。无法在下面重新启动,为什么要执行“撤消”删除操作。请给我解释一下!!!
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;
        }
    }
}