【发布时间】:2015-08-18 04:45:16
【问题描述】:
我正在开发一个 Android 应用程序,遇到了涉及 Fragments 和 FragmentTransactions 的错误。我创建了一个示例应用程序来演示该问题。这是我正在做的事情:
-
addFragment1到fragmentSpace,无需添加到后台堆栈。 -
replacefragmentSpace和Fragment2,以"beginning"的形式添加到后台。 -
addFragment3到fragmentSpace2(在Fragment2内部),不添加到 backstack。 -
replacefragmentSpace2和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 步添加到 backstack,第 5 步不再使应用程序崩溃,也不会再出现错误。为什么?
将第 3 步添加到后台堆栈时遇到的问题是,我希望用户能够在添加 Fragment3 后按下后退按钮并返回到 Fragment1。如果我将它添加到后台堆栈,那么当用户按下后退按钮时,它会删除Fragment3,但Fragment2 仍然可见,因此他们必须再次按下后退按钮。我试图避免这种双后退按钮行为。
我觉得没有必要在这个问题的示例应用中发布每个文件的代码,所以我创建了一个gist.
所以我想我的问题是:
- 为什么会出现此错误?
- 为什么我在将第 3 步添加到后台堆栈后没有收到错误消息?
- 有没有更好的“回到起点”或一次返回两个片段的方法?
谢谢!
【问题讨论】:
-
没有找到id开头的视图。只需使用
popbackstack()。
标签: android android-fragments fragmenttransaction fragmentmanager