DialogFragment dismiss() 不弹出回栈

Posted

技术标签:

【中文标题】DialogFragment dismiss() 不弹出回栈【英文标题】:DialogFragment dismiss() does not pop backstack 【发布时间】:2015-05-14 04:14:17 【问题描述】:

根据文档,我有一个简单的 DialogFragment 在退出时调用dismiss:

public voiddismiss()

关闭片段及其对话框。 如果片段被添加到 返回堆栈,直到并包括此条目的所有返回堆栈状态将 被弹出。否则,将提交一个新事务以删除 片段。

然而,我发现在调用 dismiss() 之后,片段仍然在 backstack 上,所以我必须单击返回按钮来清除它。有谁知道为什么?

这是我的代码:

public void onCreate(Bundle b) 
        super.onCreate(b);
        setContentView(R.layout.test_layout);

        class MyDialogFragment extends DialogFragment implements OnClickListener

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 

                View v = inflater.inflate(R.layout.hello_world, container, false);

                Button b = (Button)v.findViewById(R.id.btn);
                b.setOnClickListener(this);

                return v;
            

            @Override
            public void onClick(View v) 
                dismiss();
            
        

        getFragmentManager().beginTransaction().add(android.R.id.content, new MyDialogFragment(), "test").addToBackStack("b").commit();
    

    @Override
    public void onBackPressed() 
        if (getFragmentManager().getBackStackEntryCount() > 0 )
            getFragmentManager().popBackStack();
         else 
            super.onBackPressed();
        
    

我还发现如果不覆盖onBackPressed(),简单的后退按钮不起作用,无论我在activity中添加多少片段,后退按钮总是退出立即活动。

【问题讨论】:

我认为文档中的行为发生在您使用show() 方法将片段添加为实际对话框时,而不是像在代码中那样将其视为普通片段时发生。除非您做一些可疑的事情,否则“返回”按钮也应该可以工作。 您使用的是android.app.DialogFragment 还是android.support.v4.app.DialogFragment ?你找到解决这个问题的方法了吗? 【参考方案1】:

我可以确认@Luksprog在他的评论中所说的:对话必须通过show(FragmentTransaction, String)启动。

查看源代码后注意:确保在提供的事务上调用addToBackStack(String),否则它仍然无法工作。

【讨论】:

【参考方案2】:

这是创建 DialogFragment 的错误方法。

永远不要使用 FragmentManager 来显示 DialogFragment。为了展示,有一个名为 show(FragmentTransacion, String) 的方法。

在java中:

MyDialogFragment mDialogFragment = new MyDialogFragment();
mDialogFragment.show(getFragmentManager(), "MyDialogFragment");

另一方面,要关闭对话框,只需执行以下操作:

mDialogFragment.dismiss()

我想强调的另一个想法是 MyDialogFragment 类是在内部定义的 onCreate 方法:'( 如果需要,请在方法之外或在另一个文件中定义类:)

好看!

【讨论】:

以上是关于DialogFragment dismiss() 不弹出回栈的主要内容,如果未能解决你的问题,请参考以下文章

Fragment和DialogFragment生命周期关系

DialogFragment UI 在关闭后仍然存在

DialogFragment: DialogFragment的一些理解

Activity与DialogFragment交互的方法

Dialogfragment 未清除

Android:DialogFragment.dismissInternal 处 DialogFragment.dismissAllow 处的 NullPointerException