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

时间:2018-09-24 20:56:52

标签: android android-fragments fragmentmanager fragment-backstack

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

A-> B-> C-> D

有可能在D之后再次添加B。如果发生这种情况,我想删除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 个答案:

答案 0 :(得分:0)

首先加载片段A。

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

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

最后,您加载了B。因此,现在单击后退时,它显示为A。单击后退时再次显示为A。