片段和旋转

3
在 Gmail 应用中,从左侧片段选择电子邮件会像正常情况下一样在右侧片段中打开该电子邮件。将设备旋转到纵向后,只会显示所选电子邮件,正如您所期望的那样,再将设备旋转回横向,就会再次显示电子邮件列表和所选电子邮件。这是所有预期的,并且完美地工作。
然而,在 API 演示和基于片段示例的应用程序中,选择左侧片段列表中的项目并在右侧片段中显示后,将设备旋转到纵向时会显示列表片段,而不是像 Gmail 中那样显示所选项详细信息片段。回到横向模式会再次在右侧片段中显示所选项。
API Demos 示例代码:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.html 有什么想法可以重现 Gmail 应用中的效果吗?
2个回答

3
我怀疑如果你查看 /res/layout/fragment_layout.xml(设置为ActivitycontentView)中的纵向模式,你会在<fragment>标签中找到一个对列表片段而不是详细信息片段的引用。
如果你将其更改为引用详细信息片段而不是列表片段,你就会走上正确的轨道。
你可能仍然需要在代码中挖掘一下,以使逻辑完全符合你想要的布局切换,但这是开始的地方。
你会遇到另一个问题(我还没有想明白,但我想将其添加到我的答案中,因为我必须离开),就是当你首次在横向模式下启动Activity时,你很可能希望两个片段并排显示;这将对应于纵向的列表片段。在列表中选择一个项目需要切换预期的纵向行为以显示其他片段... 因此,也许保持一个布尔型变量mIsItemSelected,并在你的Activity构造函数中使用它来决定你希望显示哪个纵向布局/片段对(列表或详细信息)。

2

Jon O的回答指引了我正确的方向。实际上,在竖屏模式下,XML只显示了列表片段:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<fragment class="com.dixon.blah.Events$EventsListFragment"
        android:id="@+id/titles"
        android:layout_width="match_parent" android:layout_height="match_parent" />
</FrameLayout>

如果我将这个更改为详细信息片段,由于列表中尚未选择任何项目,因此会出现FC。通过将以下代码放入我的FragmentActivity onCreate方法中,我解决了这个问题:

if(detailsFrame != null) {
            Intent intent = new Intent();
            intent.setClass(this, EventDetailsActivity.class);
            intent.putExtra("index", mCurCheckPosition);
            intent.putExtra("id", mSelectedId);
            startActivity(intent);
}

一旦列表中的项目被选中,detailsFrame变量将指向片段的视图。因此,无论在详细信息片段中进行横向旋转还是纵向旋转,视图都保持不变,并且可以正确地显示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接