Java 没有视图的片段在配置更改时崩溃

Java 没有视图的片段在配置更改时崩溃,java,android,android-fragments,android-3.0-honeycomb,Java,Android,Android Fragments,Android 3.0 Honeycomb,我有一个UI,我需要一个片段以横向模式显示(带有视图),但不能以纵向模式显示。在纵向模式下,它应该仍然可用,但将使用ListPopupWindow显示其结果 我想我可以通过使用横向布局的标记来处理这个问题,同时以编程方式创建未启动的片段(在纵向布局的情况下) 只要您从横向开始,这就可以正常工作,如果您从纵向开始,片段是以编程方式创建的,那么当您旋转仿真器试图将片段附加到布局时,应用程序将崩溃: java.lang.IllegalStateException: 片段未创建视图。 在 android

我有一个UI,我需要一个
片段
以横向模式显示(带有视图),但不能以纵向模式显示。在纵向模式下,它应该仍然可用,但将使用
ListPopupWindow
显示其结果

我想我可以通过使用横向布局的
标记来处理这个问题,同时以编程方式创建未启动的片段(在纵向布局的情况下)

只要您从横向开始,这就可以正常工作,如果您从纵向开始,片段是以编程方式创建的,那么当您旋转仿真器试图将片段附加到布局时,应用程序将崩溃:

java.lang.IllegalStateException: 片段未创建视图。 在 android.app.Activity.onCreateView(Activity.java:4095)

Fragment.isInLayout()
的文档似乎暗示它应该能够以这种方式处理它:

如果包含布局,则返回true 作为活动视图层次结构的一部分 通过标签。这将 当片段为空时,始终为真 通过标记创建, 除非是在一个旧的 片段是从以前的 状态,并且它不会出现在 当前状态的布局

所以问题是如何正确地做到这一点,或者我是否遗漏了什么

更新:

似乎
isInLayout()
当前的行为也不正常。如果手动将
片段添加到容器中,则返回false

此外,如果手动将
片段添加到容器中,然后将(设备)旋转到不包含该布局的布局,则会崩溃:

原因: java.lang.IllegalArgumentException:否 找到了的id为0x7f060011的视图 片段搜索片段{4042f868#2 id=0x7f060011 SearchFragment}位于 FragmentManagerImpl.moveToState(FragmentManager.java:722)


你找到答案了吗?我遇到了类似的问题,并设法找到了解决办法。您可以按以下方式轻松完成您正在尝试的操作:

创建两个不同的布局,一个在布局目录中,一个在布局地目录中。布局用地目录中的一个将用于景观模式。作为一个占位符,您希望您的片段去哪里,使用s FrameLayout元素,并用id“my_fragment”标识它。布局目录中的布局不应包含任何具有该id的元素

在onCreate方法中,使用findviewbyd(R.id.my_fragment)定位片段占位符。如果存在,则处于横向模式,应添加片段(如果尚未存在):add(R.id.my_fragment,new MyFragment,“MyFragment”)。如果为空,则处于纵向模式,不应创建片段

请务必小心,不要将使用标记创建的片段替换为在程序中动态创建的片段。isInLayout返回true的片段与返回false的片段完全不同。它们的生命周期完全不同。将一个片段替换为另一个片段将导致可怕的非法行为StateException“片段未创建视图”问题


-blake

您的问题也可能是因为您正在使用的片段没有lanscape布局。您可能有一个用于纵向的lanscape布局,因此您的程序运行正常,但当您旋转设备时,操作系统可能会在横向文件夹中查找视图,但找不到该视图,因此声明该视图丢失。请检查您是否同时查看了这两个视图在文件夹“layout”和“layout land”中“

我认为碎片和配置更改存在一些奇怪之处。我提交了一份关于我发现的东西的bug报告,类似这样:。当应用程序进行设备轮换时,片段回调的顺序与文档中的不同。我很久以前就遇到过这个问题。我不知道它是否适用于您,但在我的例子中,添加
if(container==null)返回nullonCreateView()
fragment方法的开始处,code>会阻止创建视图,这会阻止加载
片段(如果定向时不需要)change@espi,我试过了,但我的片段仍然崩溃,堆栈跟踪也从未命中我的任何代码。我有一种预感,它与我的设置有关。你设置了吗?没有,我在保留实例方面遇到了很多问题,实际上不需要保留它们,所以我只是去掉了实例。我阅读了
setRetainInstance
的文档,它说它与后堆栈不兼容。我使用的是后堆栈,所以这是我的问题@hackbod:如果您使用
setRetainInstance
在backbackback中添加一个片段,您会抛出一个白痴验证异常,这将是非常棒的。谢谢您解决了这个问题。在我找到你的解释之前,我已经对这个问题绞尽脑汁了半天。如果在layout land中没有视图,那么Android只使用layout中的视图,所以这不是问题所在。