在没有添加到backstack的情况下弹出backstack时找不到id的视图

时间:2015-08-18 04:45:17

标签: android android-fragments fragmenttransaction fragmentmanager

我正在使用Android应用,遇到了涉及Fragments和FragmentTransactions的错误。我创建了一个示例应用程序来演示此问题。这就是我在做的事情:

  1. add Fragment1fragmentSpace,无需添加到Backstack。
  2. replace fragmentSpaceFragment2一起,将后台堆叠添加为"beginning"
  3. add Fragment3fragmentSpace2(位于Fragment2内),无需添加到Backstack。
  4. replace fragmentSpace2Fragment4一起,将后台堆叠添加为null
  5. 调用getFragmentManager().popBackStack("beginning", FragmentManager.POP_BACK_STACK_INCLUSIVE);以尝试撤消所有交易,这应该让用户只能看到Fragment1
  6. 但是,应用程序在第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.

    所以我想我的问题是:

    1. 为什么会出现此错误?
    2. 将第3步添加到Backstack后,为什么不收到错误?
    3. 有没有更好的方式“回到开头”或一次回到两个片段?
    4. 谢谢!

1 个答案:

答案 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?

发布的链接