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

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

我想我可以通过使用标签来处理景观布局,同时以编程方式创建片段(如果它没有启动)(在我们是纵向的情况下)。

只要您从横向开始,这样就可以正常工作,如果您以纵向方式开始以编程方式创建片段,则在您尝试将片段附加到布局时旋转模拟器时,应用程序将崩溃:

java.lang.IllegalStateException:Fragment没有创建视图。 在android.app.Activity.onCreateView(Activity.java:4095)

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

如果布局通过标记作为活动视图层次结构的一部分包含,则返回true。 当通过标记创建片段时,这将始终为真,除非旧片段从先前状态恢复且未出现在当前状态的布局中。

所以问题是如何正确地做到这一点或者是否有我遗漏的东西?

更新:

好像isInLayout()似乎不像现在那样表现。 如果已手动将Fragment添加到容器,则返回false。

此外,如果您手动将Fragment添加到容器,然后将(设备)旋转到不包含该布局的布局,它将崩溃:

引起:java.lang.IllegalArgumentException:在android.app.FragmentManagerImpl.moveToState(FragmentManager.java:722)中找不到片段SearchFragment {4042f868#2 id = 0x7f060011 SearchFragment}的id 0x7f060011的视图

Solutions Collecting From Web of "没有视图的片段在配置更改时崩溃"

你有没有想出这个答案? 我遇到了类似的问题,并设法提出了解决方案。 您可以轻松地按照以下方式执行您尝试的操作:

在布局目录中创建两个不同的布局,一个在layout-land目录中。 layout-land目录中的那个将用于横向模式。 作为占位符,您希望片段在哪里,使用s FrameLayout元素,并使用id“my_fragment”对其进行标识。 布局目录中的布局不应包含具有该id的任何元素。

在onCreate方法中,使用findViewById(R.id.my_fragment)来定位片段占位符。 如果它存在,你处于横向模式,应该添加你的片段(如果它已经不存在):add(R.id.my_fragment,new MyFragment,“myFragment”)。如果你得到null,你处于纵向模式,应该不创建片段。

请务必小心,不要将使用标记创建的片段替换为在程序中动态创建的片段。 isInLayout返回true的片段是一个完全不同的野兽,它返回false。 他们的生命周期完全不同。 用另一个替换一个将导致可怕的IllegalStateException“Fragment没有创建视图”问题。

-布莱克

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