DialogFragment dismiss()不会弹出backstack

时间:2015-03-12 05:24:19

标签: android android-fragments fragment

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

  

public void dismiss()

     

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

然而,在调用 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(),后退按钮简单不起作用,无论我添加多少片段到活动,后退按钮总是退出活动马上开始。

2 个答案:

答案 0 :(得分:3)

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

查看来源后请注意:请确保在提供的交易中致电addToBackStack(String),否则它仍然无法正常工作。

答案 1 :(得分:0)

这是创建DialogFragment的错误方法。

从不使用FragmentManager显示DialogFragment。要显示,有一个叫做show(FragmentTransacion,String)的方法。

在Java中:

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

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

mDialogFragment.dismiss()

我想强调的另一个想法是MyDialogFragment类是在onCreate方法内部定义的:'( 请在方法外定义类,或者在其他文件中定义类:)

好看!