[英]No view found for id when popping backstack without adding to backstack
我正在开发一个Android应用程序,遇到了涉及Fragments和FragmentTransactions的错误。 我创建了一个示例应用程序来演示此问题。 这是我在做的事情:
add
Fragment1
add
到fragmentSpace
,而不添加到backstack。 Fragment2
replace
fragmentSpace
,将backstack添加为"beginning"
。 add
Fragment3
add
到fragmentSpace2
(位于Fragment2
内部),而不添加到backstack。 Fragment4
replace
fragmentSpace2
,将backstack添加为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步添加到backstack,第5步不再崩溃应用程序,并且没有更多错误。 为什么?
我在向Backstack添加第3步时遇到的问题是我希望用户能够在添加Fragment3
之后按下后退按钮并返回Fragment1
。 如果我将它添加到backstack,那么当用户按下后退按钮时它会删除Fragment3
,但Fragment2
仍然可见,所以他们必须再次按下后退按钮。 我试图避免这种双后退按钮的行为。
我觉得没有必要在这个问题的示例应用程序中发布每个文件的代码,所以我创建了一个要点。
所以我想我的问题是:
谢谢!
据我所知。 您有一个片段布局,它是活动中的容器
活动主持片段1。 然后用Fragment 2替换Fragment 1(添加到后栈。
在此阶段单击后退按钮,您将弹出fragment2,并且您将看到托管fragment1的活动。
Fragment2有一个framelayout,它包含fragment3。 然后你有Fragment4替换fragment3,它被添加到后栈。
现在点击你有getFragmentManager().popBackStack("beginning", FragmentManager.POP_BACK_STACK_INCLUSIVE);
的按钮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发布的链接这是否是在离开深层嵌套堆栈时清理Fragment后端堆栈的正确方法?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.