21

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

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

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

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

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

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

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

更新:

似乎isInLayout()目前的行为也不尽如人意。如果您Fragment手动将 a 添加到容器中,它将返回 false。

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

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

4

2 回答 2

22

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

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

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

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

-布莱克

于 2011-04-06T14:53:02.680 回答
0

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

于 2012-01-04T17:46:32.443 回答