44

I am building a layout for large screens, that is supposed to consist of 2 different parts, a left one and a right one. For doing that I thought using 2 Fragments is the right choice.

Then I had a look on the example of the navigation with the Master/Detail-Flow. It has a 2-pane layout, where on the right is the navigation, and on the left is the detail view.

But in that example, different from what I expected to see, for the detail view there is a FrameLayout that then holds a Fragment, instead of a Fragment directly.

The layout XML looks like this (an example):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:baselineAligned="false"
    android:divider="?android:attr/dividerHorizontal"
    android:orientation="horizontal"
    android:showDividers="middle"
    tools:context=".WorkStationListActivity" >

    <fragment
        android:id="@+id/workstation_list"
        android:name="de.tuhh.ipmt.ialp.history.WorkStationListFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        tools:layout="@android:layout/list_content" />

    <FrameLayout
        android:id="@+id/workstation_detail_container"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="3" />

</LinearLayout>

My question now is: why is a FrameLayout used instead of the Fragment itself for the detail view? What is the reason or the advantage? Should I use it too?

4

2 回答 2

39

详细信息容器是 a FrameLayout,因为Fragment显示的 将使用FragmentTransaction'replace()方法替换。

第一个参数replace()是要替换其 Fragments 的容器的 ID。如果本例中的 FrameLayout 被替换为 Fragment,则WorkStationListFragment当前显示的 Fragment 和任何细节 Fragment 都将被新的 Fragment 替换。通过将 Fragment 封装在 FrameLayout 中,您可以只替换细节。

于 2013-10-18T15:47:09.943 回答
5

片段标签:可用于通过 XML 立即加载片段,但不能被 transaction.replace() 方法替换。可以按名称或类属性加载片段。

FrameLayout 标签:只能通过程序加载片段,也可以通过 transaction.replace() 方法替换片段。可以通过 FragmentTransction 添加/替换片段。

FragmentContainerView 标签: FragmentContainerView 是 FrameLayout 的子视图,也是最推荐加载片段的视图,它支持片段标签的属性:(名称和类),因此可以从 XML 加载片段,但与片段标签不同的是,片段可以被事务替换。代替()。我们知道它是 FrameLayout 的一个子项,因此支持 FrameLayout 的所有功能,我们可以像在 FrameLayout 的情况下一样添加片段。

此外,FrameLayout 的动画相关问题在 FragmentCotainerView 中得到解决:

以前,尝试自定义 Fragment 的进入和退出动画会导致一个问题,即进入的 Fragment 将位于退出的 Fragment 下方,直到它完全退出屏幕。这导致在片段之间转换时出现令人不快且错误的动画。

检查此链接

于 2020-02-03T06:16:48.027 回答