【发布时间】:2015-01-12 19:40:09
【问题描述】:
我使用以下代码来显示和取消对话框片段:
public static void showDialogFragment(FragmentManager fm,String type){
FragmentTransaction ft = fm.beginTransaction();
MyDialogFragment prev = (MyDialogFragment)fm.findFragmentByTag(type);
if (prev != null) {
prev.dismissAllowingStateLoss();
ft.remove(prev);
}
ft.addToBackStack(null);
MyDialogFragment newFragment = MyDialogFragment.newInstance();
try{
newFragment.show(ft,type);
}catch(IllegalStateException e){
return;
}
}
public static void cancelDialogFragment(FragmentManager fm,String tag){
FragmentTransaction ft = fm.beginTransaction();
MyDialogFragment prev = (MyDialogFragment )fm.findFragmentByTag(tag);
if (prev != null) {
prev.dismiss();
ft.remove(prev);
}
ft.addToBackStack(null);
ft.commit();
}
当我打开活动时,我会显示一个 dialogFragment,在从 Internet 接收数据后,我会取消它并显示收到的数据,但是如果我再次按下返回按钮,它会显示 dialogFragment,我必须再次按下返回按钮关闭它,然后再完成一次活动。我知道我可以覆盖onBackPressed,但我想知道为什么会这样?为什么要再次显示对话框片段?
我的代码有什么问题?
【问题讨论】:
-
尝试删除
ft.addToBackStack(null); -
@Rohit5k2 但是我已经从文档中复制了,为什么要删除它?
-
可以贴出活动类的代码吗?
-
您所做的是在
showDialogFragment()中将此片段添加到 FragmentManager 到 backstack。然后在cancelDialogFragment()方法中,您使用ft.remove(prev);将其从后台堆栈中删除,所以现在,您的后台堆栈与显示DialogFragment 之前一样。但接下来要做的是,再次将此 DialogFragment 添加到 backstack。它没有显示,但它位于 backstack 的顶部。这意味着,如果您按下 backButton,则会显示 backstack 中的顶部项目,即您的 DialogFragment。在下一次 BackPress 中,您的 DialogFragment 将被关闭。 -
您似乎显然不了解您正在使用的代码。我建议您阅读更多文档并自己试验代码,方法是注释掉并添加行以更好地理解它。
标签: android android-activity back-stack dialogfragment