Android 在弹出backstack而不添加到backstack时,找不到id的视图
我正在开发一个Android应用程序,遇到了一个涉及碎片和碎片事务的错误。我创建了一个示例应用程序来演示这个问题。以下是我正在做的:Android 在弹出backstack而不添加到backstack时,找不到id的视图,android,android-fragments,fragmenttransaction,fragmentmanager,Android,Android Fragments,Fragmenttransaction,Fragmentmanager,我正在开发一个Android应用程序,遇到了一个涉及碎片和碎片事务的错误。我创建了一个示例应用程序来演示这个问题。以下是我正在做的: 添加碎片1到碎片空间,而不添加到backstack 将碎片空间替换为碎片2,添加到backstack中作为的“开始” 将碎片3添加到碎片空间2(位于碎片2的内部),而不添加到backstack 将碎片空间2替换为碎片4,作为null添加到backstack 调用getFragmentManager()尝试撤消所有事务,这将使用户恢复仅查看片段1 但是,应用程序在步
添加
碎片1
到碎片空间
,而不添加到backstack将
碎片空间
替换为碎片2
,添加到backstack中作为的“开始”
将碎片3
添加到碎片空间2
(位于碎片2
的内部),而不添加到backstack
将碎片空间2
替换为碎片4
,作为null
添加到backstack
getFragmentManager()
尝试撤消所有事务,这将使用户恢复仅查看片段1
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添加到backbackback中,步骤5将不再使应用程序崩溃,并且不再出现错误。为什么?
将步骤3添加到backbackback的问题是,我希望用户能够在添加Fragment3
后按后退按钮,然后返回到Fragment1
。如果我将其添加到Backback中,那么当用户按下back按钮时,它将删除Fragment3
,但是Fragment2
仍然可见,因此他们必须再次按下back按钮。我正试图避免那种“双后退”按钮的行为
我觉得没有必要在示例应用程序中针对这个问题发布每个文件的代码,所以我创建了一个
所以我想我的问题是:
谢谢 据我所知。您有一个片段布局,它是活动中的容器 活动托管碎片1。然后将片段1替换为片段2(添加到后堆栈中) 在此阶段,单击“上一步”按钮,您将弹出fragment2,您将看到承载fragment1的活动 Fragment2有一个framelayout,其中保存着fragment3。然后您可以使用Fragment4替换添加到后堆栈中的fragment3 现在单击按钮,您有了
getFragmentManager().popBackStack(“开始”,FragmentManager.POP_BACK_STACK_include);
。但是没有具有该id的视图
只需使用popbackbackstack()
.Fragment4-->Fragment2(托管fragment3)-->Fragment1(由活动托管)
如果要将Fragment4添加到托管Fragment1的活动中,请不要将Fragment4添加到后堆栈中
注意:如果需要嵌套片段,则需要使用getChildFragmentManager()
另请注意评论部分的讨论和op发布的链接找不到id开头的视图。只需使用
popbackstack()
。在步骤2中,我将backstack添加为“开始”虽然:不应该从中找到它吗?@MitchTalmage但堆栈中有fragment4。@MitchTalmage还注意到fragment2在backstack中,fragment3和fragment4由fragment2托管。谢谢,我使用popBackStack做了一个for循环,解决了这个问题。我仍然不明白backstack怎么找不到“开始”然而,特别是在阅读了这个问题的答案之后:我的理解是,popBackStack(String,int)基本上会执行popBackStack(),直到它到达具有指定标记的事务。见鬼,是的!这就解决了它!非常感谢!!我不知道getChildFragmentManager(),这对我来说更有意义。谢谢!