Android:FragmentTransaction hide对DialogFragment不起作用

Chr*_*rry 4 android android-fragments android-dialogfragment

我正在尝试添加一个

fragmentTransaction.hide(myDialogFragment);
fragmentTransaction.addToBackStack(null);
Run Code Online (Sandbox Code Playgroud)

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

这仅适用于已将视图添加到容器的片段.

所以相反,现在我重写onCreateView.现在它有点隐藏,但不是真的.对话框只是萎缩,但窗口仍然是黑暗的.我必须按下后退键才能摆脱它,这显然不是我想要的行为.我在这里错过了什么?

ant*_*nyt 8

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

当你打电话时DialogFragment.show(FragmentTransaction,String),FragmentTransaction会创建a来将其添加到FragmentManager.通常,显示对话框被视为"活动"事务,然后解除它只是弹出后端堆栈适当的次数.如果您之间没有添加任何其他片段,则会使用remove操作创建一个新的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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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