Android:FragmentTransaction 隐藏不适用于 DialogFragment

标签 android android-fragments android-dialogfragment

我正在尝试添加一个

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

FragmentTransaction这样当用户点击后退按钮时对话框将重新出现,但它不起作用。我最初在我的 DialogFragment 中覆盖了 onCreateDialog,但我注意到 hide 的文档调用 FragmentTransaction 状态:

This is only relevant for fragments whose views have been added to a container.

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

最佳答案

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

当您调用 DialogFragment.show(FragmentTransaction,String) 时,将创建一个 FragmentTransaction 以将其添加到 FragmentManager。通常,显示对话框被认为是“Activity ”事务,然后关闭它只是弹出返回堆栈适当的次数。如果您没有在两者之间添加任何其他 fragment ,则会使用删除操作创建一个新的 FragmentTransaction。如果我们可以访问它,那么我们只需添加一个 backstack 条目并使该操作可逆。不幸的是,这是不可能的,所以我们能做的最好的就是制作我们自己的 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;
        }
    }
}

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

关于Android:FragmentTransaction 隐藏不适用于 DialogFragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9186086/

相关文章:

android - 操作栏如何在 FragmentTransaction replace() 和 FragmentTransaction add() 上运行

android - 具有固定页眉、可滚动正文和固定页脚的 DialogFragment

Android:自定义搜索栏缩略图显示不正确

android - 获取不同 fragment 的 EditText 值

android - 检测用户来自欧洲或美国

android - 在 onCreateView() 方法之外访问 View

android - DialogFragment 中 onCreateView 和 onCreateDialog 的区别

android dialogFragment "sometimes"不显示 webview

android - 通过后退按钮关闭弹出窗口

android - findViewById 返回 View 数组