Android - 从堆栈中间删除特定片段不起作用

Posted

技术标签:

【中文标题】Android - 从堆栈中间删除特定片段不起作用【英文标题】:Android - remove specific fragment from middle of stack not working 【发布时间】:2019-02-28 10:23:44 【问题描述】:

我想实现一个动态片段堆栈。更具体地说,例如假设以下堆栈:

A -> B -> C -> D

B 可能会在 D 之后再次添加。如果发生这种情况,我想删除 B,结果将是:

A -> C -> D -> B

我试着这样做:

void loadFragment(MyFragment f)
    FragmentManager fm = getSupportFragmentManager();
    MyFragment foundFragment = (MyFragment ) fm.findFragmentByTag(f.getClass().getName());
    if(foundFragment!=null)  
        fm.popBackStack(f.getTransactionId(), 0);
    
    String tag = f.getClass().getName();
    f.setTransactionId(tag);
    fm.beginTransaction()
         .addToBackStack(tag)
         .replace(R.id.fragment_container, f, tag)
         .commit();

所以我这样做:

loadFragment(A);
loadFragment(B);
loadFragment(A);
loadFragment(B);

然后我回击,将我降落到 A(到目前为止一切正常) 然后我再次反击,它再次将我降落到 A。(第二个 B 去了哪里???) 如果我再次回击,活动将关闭,因为没有更多的片段可以弹出。

我无法解释...

我怎样才能达到预期的行为?

【问题讨论】:

【参考方案1】:

首先加载片段 A。

然后你加载片段 B。所以现在返回堆栈看起来像 A - B

不,您尝试再次加载 A。但是已经有一个带有相同标签的片段。所以你popBackStack直到最后一次出现A(不包括A)。然后你加载 A。所以你的后台堆栈现在看起来像 A - A

最后,您加载 B。所以现在当您单击返回时,它会显示 A。当您单击返回时,它会再次显示 A。

【讨论】:

据我了解 fm.popBackStack(f.getTransactionId(), 0);删除与 fm.popBackStack(f.getTransactionId(), POP_BACK_STACK_INCLUSIVE) 相反的特定片段;这将删除该片段之前的所有内容。这不正确吗?如果不是,我如何在第二个 loadFragment(A); 之后得到 B->A;

以上是关于Android - 从堆栈中间删除特定片段不起作用的主要内容,如果未能解决你的问题,请参考以下文章

替换或删除后台堆栈上现有片段的代码不起作用

从堆栈中弹出特定片段并删除其他片段

从库中选择图像在 Android 的 Fragment 类中不起作用

在 android studio kotlin 中将数据从活动传递到片段(不重复,这些方法不起作用)

android在特定片段中隐藏工具栏

Android导航组件后退按钮不起作用