移除未放入回退栈的片段

4

我的简单布局只有一个片段占位符:

<FrameLayout
   android:id="@+id/fragment_placeholder"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
  />

首先我会将第一个Fragment添加到这个占位符中:

fragmentTransaction.add(R.id.fragment_placeholder, firstFragment, "first"); //I did not put to backstack

我有一个第二个片段,它替换了上面的片段并将其放到后台堆栈中

FragmentManager fragMgr = getSupportFragmentManager();
FragmentTransaction fragTrans = fragMgr.beginTransaction();

//initialize an fragment instance
Fragment secondFragment = initSecondFragment(); 

//replace with the fragment 
fragTrans.replace(R.id.fragment_placeholder, secondFragment, "second");

//Add fragment transaction to back stack
fragTrans.addToBackStack(null);

//commit the transaction
fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragTrans.commit();  

稍后我有一些片段替换了以前的片段,但没有放在backstack上

似乎对于那些没有放在backstack上的片段,它们将始终显示在屏幕上,按下返回按钮将不会对它们产生影响。

所以,如何在我的应用程序中找到那些没有放在backstack上的片段,并如何将它们从屏幕上移除?

1个回答

2
如何在我的应用程序中找到那些不在后退栈上的片段?
在您的FragmentManager上调用findFragmentById()或findFragmentByTag()。
如何将它们从屏幕上移除?
使用带有FragmentTransaction的remove()。

如何检查一个片段是否已添加到Backstack中? - KK_07k11A0585
2
@KK_07k11A0585:这应该单独作为一个StackOverflow问题来提问。话虽如此,如果你正在向addToBackStack()传递一个标记,你可以通过像FragmentManager上的getBackStackEntry()这样的方法迭代遍历后退栈条目,以找到具有所需标记的条目。片段本身不在返回堆栈中,片段事务才在。 - CommonsWare
我明白了。但是我有以下情况,其中有3个片段FragmentA1、FragmentA2和FragmentA3。我已经将FragmentA1和FragmentA2添加到backstack中,但没有将FragmentA3添加到其中。因此,如果我从FragmentA3按返回按钮,则会完成FragmentA2,并在FragmentA1中覆盖FragmentA3。请帮助我解决这个问题。 - KK_07k11A0585
1
@KK_07k11A0585:随意开启新的StackOverflow答案,解释您的问题,看看是否有人可以帮助。 - CommonsWare
我曾经遇到过完全相同的问题,现在已经提出了问题:http://stackoverflow.com/questions/22865438/android-fragment-back-button-overlays-other-fragment-and-keeps-active 和 Google 问题:https://code.google.com/p/android/issues/detail?id=68160 - Gunnar Bernstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接