我正在使用Android应用,遇到了涉及Fragments和FragmentTransactions的错误。我创建了一个示例应用程序来演示此问题。这就是我在做的事情:
add
Fragment1
到fragmentSpace
,无需添加到Backstack。replace
fragmentSpace
与Fragment2
一起,将后台堆叠添加为"beginning"
。add
Fragment3
到fragmentSpace2
(位于Fragment2
内),无需添加到Backstack。replace
fragmentSpace2
与Fragment4
一起,将后台堆叠添加为null
。getFragmentManager().popBackStack("beginning", FragmentManager.POP_BACK_STACK_INCLUSIVE);
以尝试撤消所有交易,这应该让用户只能看到Fragment1
。但是,应用程序在第5步崩溃时出现此错误:
java.lang.IllegalArgumentException: No view found for id 0x7f090004 (me.MitchT.testfragmenttransactions:id/fragmentSpace2) for fragment Fragment3{7f35cb6 #2 id=0x7f090004}
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:886)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
at android.app.BackStackRecord.popFromBackStack(BackStackRecord.java:1645)
...
我发现如果我将第3步添加到后台堆栈,则第5步不再崩溃应用程序,并且不会再出现错误。为什么呢?
我在向Backstack添加第3步时遇到的问题是,我希望用户能够在添加Fragment3
后按下后退按钮并返回Fragment1
。如果我将其添加到Backstack,那么当用户按下后退按钮时,它会移除Fragment3
,但Fragment2
仍然可见,因此他们必须再次按下后退按钮 。我试图避免这种双后退按钮的行为。
我认为没有必要在此问题的示例应用中发布每个文件的代码,因此我创建了gist.
所以我想我的问题是:
谢谢!
答案 0 :(得分:2)
据我所知。您有一个片段布局,它是活动中的容器
活动托管Fragment1。然后用Fragment 2替换Fragment 1(添加到后栈。
在此阶段单击后退按钮,您将弹出fragment2,并且您将看到托管fragment1的活动。
Fragment2有一个framelayout,它包含fragment3。然后你有Fragment4替换fragment3,它被添加到后栈。
现在点击您有getFragmentManager().popBackStack("beginning", FragmentManager.POP_BACK_STACK_INCLUSIVE);
的按钮。但是没有关于那个id的观点。
只需使用popBackStack()
即可。 Fragment4 - > Fragment2(托管片段3) - > Fragment1(由活动托管)。
如果你想让Fragment4到Activity托管Fragment1,请不要将Fragment4添加到后台。
注意:如果您需要嵌套片段,则需要使用getChildFragmentManager()
。 https://developer.android.com/about/versions/android-4.2.html
另请注意评论部分中的讨论以及op Is this the right way to clean-up Fragment back stack when leaving a deeply nested stack?
发布的链接