DialogFragment 显示在后退按钮按下即使我删除它

DialogFragment shows onBack button press even if I remove it

我使用了以下代码来显示和取消 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();

}

当我打开 activity 时,我显示一个 dialogFragment,在从互联网接收数据后,我取消它并显示接收到的数据,但是如果我再次按下后退按钮,它会显示 dialogFragment我必须再次按下后退按钮将其关闭,然后再按一次才能完成 activity。我知道我可以覆盖 onBackPressed 但我想知道为什么会这样?为什么再次显示对话片段?

我的代码有什么问题?

将整个取消 DialogFragment 替换为:

public static void cancelDialogFragment(FragmentManager fm,String tag){
    fm.popBackStack();
}

你所做的是在 showDialogFragment() 中将此片段添加到 FragmentManager 以返回堆栈。然后在 cancelDialogFragment() 方法中使用 ft.remove(prev);

从 backstack 中删除它

现在,您的后台堆栈与显示 DialogFragment 之前一样。

但是您接下来要做的是,将此 DialogFragment 再次添加到 backstack。它没有显示,但它位于 backstack 的顶部。这意味着,如果您按下 backButton,将显示 backstack 中的顶部项目,即您的 DialogFragment。在下一个 BackPress 上,您的 DialogFragment 将被关闭。

所以不要在 cancelDialogFragment() 方法中将片段添加到 backstack。

删除这一行:

ft.addToBackStack(null);

终于找到原因和正确答案了。问题在于:

ft.addToBackStack(null); 

来自文档:

Add this transaction to the back stack. This means that the transaction will be remembered after it is committed, and will reverse its operation when later popped off the stack.

Parameters name An optional name for this back stack state, or null.

那个男人:

嘿 android 我已经从 backstack 中删除了 dialogfragment(所以 backStack 的顶部没有任何东西,@Vojtaaa9 的回答是错误的,因为正如我添加的调用取消后 运行 MyDialogFragment prev = (MyDialogFragment )fm.findFragmentByTag(tag); 时的评论将得到 null,这意味着 backStack 没有任何 dialogfragment)但请记住我的操作,请记住有一个 dialogfragment 但现在它已被删除。当用户按下后退按钮时,事务反转,这意味着 现在 backStack 顶部没有任何内容,但随后 android 将 dialogFragment 推送到backStack 以相反的顺序进行交易。