即使我删除它,也会在后退按钮上显示DialogFragment

时间:2015-01-12 19:40:09

标签: android android-activity back-stack dialogfragment

我使用以下代码显示和取消对话碎片:

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,但我想知道为什么会这样?为什么剂量再次显示对话碎片?

我的代码出了什么问题?

3 个答案:

答案 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); 

来自文件:

  

将此事务添加到后台堆栈。这意味着   交易将在提交后被记住,并将被撤销   以后弹出堆栈时的操作。

     

参数name此后备堆栈状态的可选名称,或null。

那个menas:

嘿android 我已经从backstack中移除了dialogfragment (所以backStack顶部没有任何内容,@ Vojtaaa9的答案是错误的,因为我在你运行{{1}时添加了评论调用cancel后你会得到null,这意味着backStack不会有任何对话碎片)但重新启动我的动作,记住有一个dialogfragment但现在已经删除了。当用户按下后退按钮时,事务会反转,这意味着现在backStack顶部没有任何内容但是 android会将dialogFragment推送到backStack,以相反的顺序执行事务