没有视图的碎片在configuration改变时崩溃

我有一个用户界面,我需要在横向模式下显示(与视图) Fragment ,但不是在纵向模式。 在纵向模式下,它应该仍然可用,但会使用ListPopupWindow代替显示其结果。

我想我可以通过使用横向布局的<fragment />标记来处理这个问题,而如果它没有开始的话(在我们是纵向的情况下)以编程的方式创build片段。

这只要你开始在横向,这工作得很好,如果你开始在肖像的地方创build片段编程的应用程序将崩溃当您试图将片段附加到您的布局旋转模拟器:

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

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

如果布局通过标签包含在活动视图层次结构中,则返回true。 在通过标签创build片段时,除非旧片段从之前的状态恢复,并且不会出现在当前状态的布局中,否则这将始终为真。

所以问题是如何正确地做到这一点,或者如果有什么我失踪?

更新:

看起来像isInLayout()是不是现在应该如此。 如果手动添加了一个Fragment到一个容器,它将返回false。

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

由于:java.lang.IllegalArgumentException:未findid为0x7f060011的片段SearchFragment {4042f868#2 id = 0x7f060011 SearchFragment} at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:722)

Solutions Collecting From Web of "没有视图的碎片在configuration改变时崩溃"

你有没有想出这个答案? 我有类似的问题,并设法提出一个解决scheme。 你可以很容易地做你正在尝试如下:

在layout目录中创build两个不同的布局,一个在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,则您处于纵向模式,应该不创build片段。

要非常小心,你永远不要用你的程序dynamic地创build一个标签来代替使用标签创build的片段。 isInLayout返回true的片段是一个完全不同的野兽,为其返回false。 他们的生命周期完全不同。 replace一个会导致可怕的IllegalStateException“Fragment没有创build视图”的问题。

-布莱克

你的问题也可能是由于没有你正在使用的片段的lanscape布局。 你可能有一个肖像,所以你的程序运行良好,但是当你旋转你的设备时,操作系统可能会寻找景观文件夹中的视图,并没有find视图,因此声明为缺less。 检查是否在文件夹“layout”和“layout-land”中都有查看。