3

在 Gmail 应用程序中,从左侧片段中选择一封电子邮件会正常打开右侧片段中的电子邮件。如您所料,将设备旋转为纵向仅显示选定的电子邮件,将设备旋转回横向将再次显示电子邮件列表和选定的电子邮件。这一切都在意料之中,而且效果很好。

但是,在 API 演示和我的基于 Fragments 示例的应用程序中,从左侧片段列表中选择一个项目并显示在右侧片段中后,设备旋转到纵向显示列表片段而不是所选项目Gmail 中的详细信息片段。返回横向显示在右侧片段中再次显示所选项目。

API Demos 示例代码:http: //developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.html

知道如何重新创建 Gmail 应用程序中显示的内容吗?

4

2 回答 2

3

我怀疑如果您查看纵向模式/res/layout/fragment_layout.xml(设置为contentViewfor the Activity),您会在<fragment>标签中找到对列表片段而不是细节片段的引用。

如果您将其切换为引用细节片段而不是列表片段,那么您将走在正确的轨道上。

考虑到我刚才提到的布局开关,您可能仍然需要深入研究代码以使逻辑完全按照您的要求运行,但这就是开始的地方。

你会遇到另一个问题(虽然我想将这个添加到我的答案中,因为我必须运行,但我还没有考虑过这个问题),那就是当你第一次在 Landscape 中启动 Activity 时,你可能需要并排放置两个片段;这将对应于纵向列表片段。在列表中选择一个项目需要将预期的纵向行为切换为显示另一个片段......所以也许保留一个布尔值mIsItemSelected并在您的构造函数中使用它Activity来决定您希望显示哪个纵向布局/片段对(列表或细节)。

于 2012-04-20T21:00:27.247 回答
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 变量将指向片段的视图。因此,从细节片段中的纵向旋转到横向并再次返回,视图保持并正确显示。

于 2012-04-20T23:19:03.087 回答