安卓:FragmentTransaction 隐藏操作无法隐藏 DialogFragment

4
我正在尝试添加一个
fragmentTransaction.hide(myDialogFragment);
fragmentTransaction.addToBackStack(null);

我希望将对话框转换为FragmentTransaction,以便当用户点击返回按钮时,对话框会重新出现,但这并没有起作用。我最初在DialogFragment中重写了onCreateDialog,但我注意到FragmentTransaction上的hide调用的文档如下:

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

因此,现在我改为重写onCreateView。现在它有点隐藏了,但不完全正确。对话框只是缩小了,但窗口仍然保持黑暗。显然,我不想这样做,必须点击返回按钮才能摆脱它。我错过了什么?

3个回答

10

DialogFragment 内部维护着一个对话框,并根据自己的生命周期调用其内部的展示和隐藏方法。调用 FragmentTransaction.hide() 尝试将片段的视图(由Fragment.onCreateView()返回)的可见性设置为 View.GONE。 DialogFragment 的视图恰巧是用于其内部对话框的视图,因此您要做的就是隐藏对话框中的内容。不幸的是,隐藏视图并不能“解散”对话框,因此屏幕仍然会变暗。

当您调用 DialogFragment.show(FragmentTransaction,String) 时,会创建一个 FragmentTransaction 来将其添加到 FragmentManager 中。通常,展示对话框被认为是“活动”事务,然后关闭它只是弹出回退栈相应次数。如果您没有在中间添加任何其他片段,则会创建一个新的 FragmentTransaction 并执行删除操作。如果我们可以访问到这个过程,那么我们就可以添加一个回退栈条目并使此操作可逆转。不幸的是,这是不可能的,所以我们能做的最好的办法就是自己实现一个 dismiss 方法(并希望内部状态不会受到太大的影响):

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,其中包含自己的Dismiss按钮。按下Dismiss后,您可以通过按返回键再次显示对话框,撤销删除操作。当您允许返回键同时显示和隐藏对话框时,这会产生一些可疑的行为,但是具体细节可以根据您的应用程序进行决定。

1
我遇到了一个很棒的问题(返回 -> 新片段),通过在我的代码中注释掉beginTransaction().remove,问题得以解决。我不明白为什么返回会执行“撤销”删除操作。请解释一下! - Sergey Vakulenko

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

1

如果您使用的是API Level 11或更高版本,则可以直接从FragmentActivityDialogFragment本身调用dismiss()来关闭DialogFragment


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