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

时间:2011-02-08 18:54:21

标签: java android android-fragments android-3.0-honeycomb

我有一个UI,我需要在横向模式下显示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} at   android.app.FragmentManagerImpl.moveToState(FragmentManager.java:722)

2 个答案:

答案 0 :(得分:22)

你想出答案吗?我遇到了类似的问题,并设法提出了解决方案。您可以按照以下方式轻松完成您的尝试:

在布局目录中创建两个不同的布局,一个在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没有创建视图”问题。

-blake

答案 1 :(得分:0)

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