【发布时间】:2011-06-23 15:38:10
【问题描述】:
我有一个用户界面,我需要一个Fragment 以横向模式显示(带有视图),而不是纵向模式。在纵向模式下,它应该仍然可用,但将改为使用 ListPopupWindow 显示其结果。
我想我可以通过将<fragment /> 标签用于横向布局来处理这个问题,同时以编程方式创建片段,如果它没有启动(在我们处于纵向的情况下)。
只要您从横向开始就可以正常工作,如果您在以编程方式创建片段的纵向开始,当您旋转模拟器尝试将片段附加到您的布局时,您的应用程序将崩溃:
java.lang.IllegalStateException: 片段没有创建视图。 在 android.app.Activity.onCreateView(Activity.java:4095)
Fragment.isInLayout() 的文档似乎暗示它应该能够以这种方式处理它:
如果包含布局,则返回 true 作为活动视图层次结构的一部分 通过标签。这会 当片段为真时 通过标签创建, 除非是旧的 片段是从以前的 状态,它不会出现在 当前状态的布局。
所以问题是如何正确执行此操作,或者我是否缺少某些东西?
更新:
似乎isInLayout() 的行为不像现在应该的那样。如果您手动将Fragment 添加到容器中,它将返回 false。
此外,如果您手动将Fragment 添加到容器中,然后将(设备)旋转到不包含该布局的布局,则会崩溃:
原因: java.lang.IllegalArgumentException:否 为 id 0x7f060011 找到的视图 片段 SearchFragment{4042f868 #2 id=0x7f060011 SearchFragment} 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:722)
【问题讨论】:
-
我认为片段和配置更改有些奇怪。我提交了一份关于我发现类似于以下内容的错误报告:code.google.com/p/android/issues/detail?id=14796。当应用程序经历设备轮换时,片段回调的顺序没有记录。
-
我很久以前就遇到过这个问题。我不知道它是否适用于您,但就我而言,在
onCreateView()片段方法的开头添加if (container == null) return null;会阻止创建视图,这会阻止Fragment在不需要时加载关于方向变化 -
@espi,我试过了,但我的 Fragment 仍然崩溃,堆栈跟踪甚至从未命中我的任何代码。我有一种预感,它与我的设置 setRetainInstance 有关。你设置了吗?
-
不,我在保留实例方面遇到了很多问题,而且我真的不需要保留它们,所以我只是摆脱了实例。
-
我阅读了
setRetainInstance的文档,它说它与后堆栈不兼容。我正在使用后台堆栈,所以这是我的问题。 developer.android.com/reference/android/app/… @hackbod:如果您使用setRetainInstance将片段添加到后台堆栈,那么如果您抛出其中一个防白痴异常,那就太好了
标签: java android android-fragments android-3.0-honeycomb