Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在弹出backstack而不添加到backstack时,找不到id的视图_Android_Android Fragments_Fragmenttransaction_Fragmentmanager - Fatal编程技术网

Android 在弹出backstack而不添加到backstack时,找不到id的视图

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 但是,应用程序在步

我正在开发一个Android应用程序,遇到了一个涉及碎片和碎片事务的错误。我创建了一个示例应用程序来演示这个问题。以下是我正在做的:

  • 添加
    碎片1
    碎片空间
    ,而不添加到backstack
  • 碎片空间
    替换为
    碎片2
    ,添加到backstack中作为
    的“开始”
  • 碎片3
    添加到
    碎片空间2
    (位于
    碎片2
    的内部),而不添加到backstack
  • 碎片空间2
    替换为
    碎片4
    ,作为
    null
    添加到backstack
  • 调用
    getFragmentManager()
    尝试撤消所有事务,这将使用户恢复仅查看
    片段1
  • 但是,应用程序在步骤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添加到backbackback中,步骤5将不再使应用程序崩溃,并且不再出现错误。为什么?

    将步骤3添加到backbackback的问题是,我希望用户能够在添加
    Fragment3
    后按后退按钮,然后返回到
    Fragment1
    。如果我将其添加到Backback中,那么当用户按下back按钮时,它将删除
    Fragment3
    ,但是
    Fragment2
    仍然可见,因此他们必须再次按下back按钮。我正试图避免那种“双后退”按钮的行为

    我觉得没有必要在示例应用程序中针对这个问题发布每个文件的代码,所以我创建了一个

    所以我想我的问题是:

  • 为什么会出现这个错误
  • 为什么在将步骤3添加到backbackback之后我没有得到错误
  • 是否有更好的方法“回到起点”或一次返回两个片段

  • 谢谢

    据我所知。您有一个片段布局,它是活动中的容器

    活动托管碎片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(),这对我来说更有意义。谢谢!