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

ale*_*lom 21 java android android-fragments android-3.0-honeycomb

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

我想我可以通过使用<fragment />横向布局的标签来处理这个问题,同时如果它没有启动(在我们是肖像的情况下)以编程方式创建片段.

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

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

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

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

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

更新:

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

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

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

小智 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没有创建视图"问题.

-布莱克