我使用以下代码显示和取消对话碎片:
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,在收到来自互联网的数据后,我取消它并显示收到的数据,但如果我再次按回按钮它会显示dialogFragment,我必须再次按下后退按钮解雇它,再一次完成活动。我知道我可以覆盖onBackPressed
,但我想知道为什么会这样?为什么剂量再次显示对话碎片?
我的代码出了什么问题?
答案 0 :(得分:1)
您在showDialogFragment()
中执行的操作是将此片段添加到FragmentManager以进行反向堆叠。然后在cancelDialogFragment()
方法中,使用ft.remove(prev);
所以现在,你的Backstack就像在显示DialogFragment之前一样。
但接下来你要做的是,你再次将这个DialogFragment添加到backstack。它没有显示,但它在backstack的顶部。这意味着,如果按backButton,将显示Backstack中的顶级项目DialogFragment。在下一个BackPress上,您的DialogFragment将被解雇。
所以不要在cancelDialogFragment()
方法中将片段添加到backstack。
删除此行:
ft.addToBackStack(null);
答案 1 :(得分:0)
用以下内容替换整个cancelDialogFragment:
public static void cancelDialogFragment(FragmentManager fm,String tag){
fm.popBackStack();
}
答案 2 :(得分:0)
最后我找到了原因和正确的答案。问题在于:
ft.addToBackStack(null);
来自文件:
那个menas:将此事务添加到后台堆栈。这意味着 交易将在提交后被记住,并将被撤销 以后弹出堆栈时的操作。
参数name此后备堆栈状态的可选名称,或null。
嘿android 我已经从backstack中移除了dialogfragment (所以backStack顶部没有任何内容,@ Vojtaaa9的答案是错误的,因为我在你运行{{1}时添加了评论调用cancel后你会得到null,这意味着backStack不会有任何对话碎片)但重新启动我的动作,记住有一个dialogfragment但现在已经删除了。当用户按下后退按钮时,事务会反转,这意味着现在backStack顶部没有任何内容但是 android会将dialogFragment推送到backStack,以相反的顺序执行事务强>