我有一个简单的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(),后退按钮简单不起作用,无论我添加多少片段到活动,后退按钮总是退出活动马上开始。
答案 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方法内部定义的:'( 请在方法外定义类,或者在其他文件中定义类:)
好看!